我完全陷入困境。我试图在Android环境中对点击的对象进行简单的去引用,但是对于我的生活却找不到方法。
我有一个MainView,我加载json对象,然后将这些对象传递给我的适配器,在那里我找到了这些对象。我点击列表中的TextView项目来捕获点击事件。
问题:OnClick会触发,但我无法从那里取回原始绑定对象,或者我不确定如何?我试图使用一个位置变量,当每个行调用getView函数时,该位置变量会增加,但是当OnClick发生时我的位置总是指向列表中的最后一个记录。我也尝试在MainView中实现onItemClick,但似乎永远不会触发。
如何找回绑定到TextView的对象?提前感谢您对此的任何帮助。
public class MainActivity extends AppCompatActivity {
private static final String LOCATION_KEY = "location";
SharedPreferences pref;
SharedPreferences.Editor editor;
public JSONObject jsonObj = null;
ListView mainList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(com.digitour.www.R.layout.activity_main);
// Load state from shared preferences
pref= getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE);
editor=pref.edit();`enter code here`
mainList = (ListView) findViewById(com.digitour.www.R.id.checkableList);
try {
jsonObj=new JSONObject(pref.getString("json",null));
// Bind Data and pass the json object read from a file to the adapter
MainViewAdapter customListViewAdapter = new MainViewAdapter(this, jsonObj);
mainList.setAdapter(customListViewAdapter);
} catch (Exception e) {
e.printStackTrace();
}
}
}
以下是适配器代码:
public class MainViewAdapter extends BaseAdapter {
private LayoutInflater layoutInflater;
private Context context;
private JSONArray listItems;
private int positionPrivate;
private JSONObject jsonObj;
public MainViewAdapter(Context context, JSONObject jsonObj) {
layoutInflater = LayoutInflater.from(context);
this.context = context;
this.jsonObj = jsonObj;
JSONObject jObjectResult = null;
try {
jObjectResult = jsonObj.getJSONObject("Items");
this.listItems = jObjectResult.getJSONArray("Item");
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final SharedPreferences pref= context.getApplicationContext ().getSharedPreferences("MyPref", context.MODE_PRIVATE);
final SharedPreferences.Editor editor = pref.edit();
try {
positionPrivate = position;
if(convertView == null){
convertView = layoutInflater.inflate (com.digitour.www.R.layout.activity_row,parent,false);
}
TextView textView = (TextView) convertView.findViewById (com.digitour.www.R.id.rowText);
textView.setText(listItems.getJSONObject(position).getString ("description"));
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try{
//Trying to get here the bound object
TextView tv = (TextView)v;
int id = tv.getId();
if (listItems != null){
JSONObject clickedItem = listItems.getJSONObject(positionPrivate); // positionPrivate always indexed to last item in a list
Intent intent = new Intent(context, DetailActivity.class);
context.startActivity(intent);
}
} catch (Exception e){
e.printStackTrace();
}
}
});
return convertView;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
答案 0 :(得分:1)
你有一个存储索引的成员变量private int positionPrivate
。它只能容纳一个索引,所以最后写入最后一个索引。
尝试删除此变量,只需使用position
函数中的getView
参数。
JSONObject clickedItem = listItems.getJSONObject(position);
答案 1 :(得分:1)
我认为您正在寻找的是setTag(Object tag)
方法。
textView.setTag(position)
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = (int) textView.getTag()
if (listItems != null) {
JSONObject clickedItem = listItems.getJSONObject(position);
...
}
}
}