Android从OnClick获取绑定对象

时间:2016-11-27 05:27:37

标签: android

我完全陷入困境。我试图在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;
    }
}

}

2 个答案:

答案 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);
            ...
        }
    }
}