実際、私はこれについていくつかの以前の質問を読みました...
これは私が使用するコードです
auto = (ListView)findViewById(R.id.auto);
String[] projection = new String[] {Browser.BookmarkColumns._ID,Browser.BookmarkColumns.TITLE,Browser.BookmarkColumns.URL};
String[] displayFields = new String[] {Browser.BookmarkColumns.TITLE, Browser.BookmarkColumns.URL};
int[] displayViews = new int[] { R.id.text1,R.id.text2 };
Cursor cur = managedQuery(Android.provider.Browser.BOOKMARKS_URI,projection, null, null, null);
//auto.setAdapter(new SimpleCursorAdapter(this, R.layout.mylist, cur,displayFields, displayViews));
myAdapter apt = new myAdapter(this, R.layout.mylist, cur,displayFields, displayViews);
auto.setAdapter(apt);
とクラスmyAdapter
class myAdapter extends SimpleCursorAdapter{
private Cursor c;
private Context context;
public myAdapter(Context context, int layout, Cursor c, String[] from,
int[] to) {
super(context, layout, c, from, to);
// TODO Auto-generated constructor stub
this.c = c;
this.context = context;
AutoList att = new AutoList();
mListView = att.auto;
}
@Override
public View getView(int pos, View inView, ViewGroup parent) {
View vix = inView;
if (vix == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
vix = inflater.inflate(R.layout.mylist, null);
}
this.c.moveToPosition(pos);
String title = this.c.getString(this.c.getColumnIndex(Browser.BookmarkColumns.TITLE));
String cont = this.c.getString(this.c.getColumnIndex(Browser.BookmarkColumns.URL));
TextView text1 = (TextView) vix.findViewById(R.id.text1);
text1.setText(title);
TextView text2 = (TextView) vix.findViewById(R.id.text2);
text2.setText(cont);
Button butt = (Button) vix.findViewById(R.id.button);
butt.setOnClickListener(mButt);
return vix;
}
private OnClickListener mButt = new OnClickListener() {
@Override
public void onClick(View v) {
final int position = mListView.getPositionForView((View) v.getParent());
Log.v("BUTT", "Title clicked, row "+position);
}
};
ただし、ボタンをクリックすると、次のようなエラーが多数発生します。
04-10 22:30:55.152: ERROR/AndroidRuntime(695): FATAL EXCEPTION: main
04-10 22:30:55.152: ERROR/AndroidRuntime(695): Java.lang.NullPointerException
04-10 22:30:55.152: ERROR/AndroidRuntime(695): at com.auto2.AutoList$myAdapter$1.onClick(AutoList.Java:113)
04-10 22:30:55.152: ERROR/AndroidRuntime(695): at Android.view.View.performClick(View.Java:2408)
04-10 22:30:55.152: ERROR/AndroidRuntime(695): at Android.view.View$PerformClick.run(View.Java:8816)
04-10 22:30:55.152: ERROR/AndroidRuntime(695): at Android.os.Handler.handleCallback(Handler.Java:587)
04-10 22:30:55.152: ERROR/AndroidRuntime(695): at Android.os.Handler.dispatchMessage(Handler.Java:92)
04-10 22:30:55.152: ERROR/AndroidRuntime(695): at Android.os.Looper.loop(Looper.Java:123)
04-10 22:30:55.152: ERROR/AndroidRuntime(695): at Android.app.ActivityThread.main(ActivityThread.Java:4627)
04-10 22:30:55.152: ERROR/AndroidRuntime(695): at Java.lang.reflect.Method.invokeNative(Native Method)
04-10 22:30:55.152: ERROR/AndroidRuntime(695): at Java.lang.reflect.Method.invoke(Method.Java:521)
04-10 22:30:55.152: ERROR/AndroidRuntime(695): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:868)
04-10 22:30:55.152: ERROR/AndroidRuntime(695): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:626)
04-10 22:30:55.152: ERROR/AndroidRuntime(695): at dalvik.system.NativeStart.main(Native Method)
それでおしまい!理解するのがそれほど難しくないことを願っています!
ありがとう!
クリック可能なボタンのあるListView !!!
さて....、これが私の問題を解決するための大まかな方法ですSO FAR..。
item.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:orientation="horizontal"
Android:layout_height="wrap_content">
<TextView Android:id="@+id/showTv"
Android:layout_alignParentLeft="true"
Android:gravity="center_vertical"
Android:textSize="24dip"
Android:layout_height="wrap_content"
Android:layout_width="wrap_content" />
<RelativeLayout Android:id="@+id/jjjj"
Android:layout_alignParentRight="true"
Android:layout_height="wrap_content"
Android:layout_width="wrap_content">
<Button Android:id="@+id/gointoBt"
Android:focusable="false"
Android:layout_alignParentRight="true"
Android:text="abc"
Android:layout_height="wrap_content"
Android:layout_width="wrap_content"/>
<Button Android:id="@+id/chooseBt"
Android:layout_toLeftOf="@id/gointoBt"
Android:layout_marginRight="10dip"
Android:text="text"
Android:focusable="false"
Android:layout_height="wrap_content"
Android:layout_width="wrap_content"/>
</RelativeLayout>
MySimpleAdapter:
import ........;
public class MySimpleAdapter extends SimpleAdapter {
private final Context context;
private List<Map<String, Object>> data;
private int resource;
private String[] from;
private int[] to;
public MySimpleAdapter(Context context,List<? extends Map<String, ?>> data, int resource, String[] from,
int[] to) {
super(context, data, resource, from, to);
this.context=context;
this.data=(List<Map<String, Object>>) data;
this.resource=resource;
this.from=from;
this.to=to;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
View rowView = inflater.inflate(resource, null, true);
Map<String, Object> medMap=data.get(position);
final TextView[] showTv=new TextView[from.length];
for (int i = 0; i < from.length; i++) {
showTv[i]=(TextView)rowView.findViewById(to[i]);
showTv[i].setText(""+medMap.get(from[i]));
}
Button btn=(Button)rowView.findViewById(R.id.gointoBt);
Button.OnClickListener mOkOnClickListener = new Button.OnClickListener()
{
public void onClick(View v) {
Log.v("ttttttt", ""+showTv[0].getText());
Toast.makeText(context,""+showTv[0].getText(), Toast.LENGTH_LONG).show();
}
};
btn.setOnClickListener(mOkOnClickListener);
Button btn2=(Button)rowView.findViewById(R.id.chooseBt);
Button.OnClickListener mOkOnClickListener2 = new Button.OnClickListener()
{
public void onClick(View v) {
Log.v("hhhhhhh", ""+showTv[0].getText());
Toast.makeText(context,"abc"+showTv[0].getText(), Toast.LENGTH_LONG).show();
}
};
btn2.setOnClickListener(mOkOnClickListener2);
return rowView;
}
}
活動:
import .......;
public class ActivityMain extends Activity {
ListView listview;
List<Map<String,Object>> data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle("My work");
prepareData();
listview =new ListView(this);
MySimpleAdapter adapter=new MySimpleAdapter(this,data,R.layout.item,new String[] {"uu"},new int[]{R.id.showTv});
listview.setAdapter(adapter);
setContentView(listview);
}
private void prepareData(){
data=new ArrayList<Map<String,Object>>();
Map<String,Object> item;
item=new HashMap<String,Object>();
item.put("uu", "hello");
data.add(item);
item=new HashMap<String,Object>();
item.put("uu", "myyou");
data.add(item);
item=new HashMap<String,Object>();
item.put("uu", "piero");
data.add(item);
}
}
この素晴らしいが最も強力なチュートリアルを提供してくれてとても親切なその男に感謝します....ここの誰もが初心者に与えることができなかった....
実際、私は同じアプローチを使用しました-親レイアウトのキャストを追加しただけで、例外なしで位置を取得しました
public void deleteButtonClick(View v) {
//TODO Remove favorite - DB + file system
Toast.makeText(this, "Deleting bookmark", Toast.LENGTH_SHORT).show();
final int position = getListView().getPositionForView((LinearLayout)v.getParent());
if (position >= 0) {
Favorite o = (Favorite) this.getListAdapter().getItem(position);
}
}
リストビュー行のレイアウト:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res/com.bbox.application"
Android:orientation="vertical" Android:layout_width="fill_parent"
Android:layout_height="fill_parent">
<com.markupartist.Android.widget.ActionBar
Android:id="@+id/actionbar" app:title="@string/ac_title" style="@style/ActionBar" />
<ListView Android:id="@+id/Android:list" Android:layout_width="fill_parent"
Android:layout_height="wrap_content" Android:layout_weight="5"
Android:background="@drawable/categrory_bckgr" />
<TextView Android:id="@+id/Android:empty"
Android:layout_width="fill_parent" Android:layout_height="wrap_content"
Android:text="@string/main_no_items" />
</LinearLayout>
お役に立てば幸いです。
アダプターのgetViewメソッド内にonClickListenerを実装することで、位置を取得できます。
アダプター:
public class DetailsListAdapter extends BaseAdapter {
Context context;
ArrayList<Profile> data;
public DetailsListAdapter(Context context, ArrayList<Profile> data) {
this.context = context;
this.data = data;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.list_item_logs_details, null);
viewHolder = new ViewHolder();
viewHolder.btn = (Button) convertView.findViewById(R.id.log_details_1_a);
viewHolder.btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("statusPosition","position "+position);
}
});
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
return convertView;
}
public static class ViewHolder {
TextView tv2, tv3, tv3a, tv4, tv4a;
Button btn;
}
}
これに対するより簡単な解決策は、アクティビティがOnClickListenerを実装し、(キャストされた)コンテキストをOnClickListenerとしてアダプターで必要な任意のビューに設定する場合です。より堅牢なコードについては、instanceofで確認できます。
public class MyActivity implements OnClickListener {
// ...
}
public class MyAdapter extends CursorAdapter {
@Override
public void bindView(View view, Context context, Cursor cursor) {
final TextView tv = (View) view.findViewById(R.id.text1);
setOnClickListener((OnClickListener)context);
tv.setTag(cursor.getPosition());
}
}
便宜上、アダプタ内のアイテムの位置をビューのタグとして設定できます。これにより、アダプタ内のアイテム全体を簡単に検索できます。
もう1つの最善のアプローチがあると思います。(button.setTag())メソッドを使用してボタンの位置として1つのタグを追加し、ユーザーがボタンをクリックするたびにこのボタンのタグを取得することができます。それはより簡単になります。
よろしくラフル
とてもシンプルです。 AdapterクラスでgetView
メソッドをint positionからfinal int positionに変更します。
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(yourcustomizeditemview.xml, parent,
false);
Button btn= (Button) row.findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(context, " "+position, Toast.LENGTH_SHORT).show();
}
});
return row;
}
Button
をクリックするとToast
は、Button
が存在するアイテムの位置を示します。
onClick()
ではmListView
がnullのようです。それは可能です
auto = (ListView)findViewById(R.id.auto);
現在のレイアウトでR.id.auto
のビューが見つからなかったため、nullが返されました。その行の直後にデバッガーブレークポイントを配置して確認します。
これを実行しますか
btnNxt = (Button) findViewById(R.id.btnNext);
btnNxt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//Here I need to get that position
});
getViewメソッド内?もしそうなら、それは非常に簡単です
btnNxt = (Button) findViewById(R.id.btnNext);
btnNxt.setTag(position);
btnNxt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
int position=(Integer)arg0.getTag();
});