2013-08-25 54 views
1

好了,标题是propably不清楚,这里是我想做的事: 我有ListView和每一行里面有一些文字和一个按钮。我设置监听到每个按钮(在我的自定义列表适配器)这样的:获取数据对象

public View getView(int position, View convertView, ViewGroup parent) { 

    if (convertView == null) { 
     LayoutInflater li; 
     li = LayoutInflater.from(context); 
     convertView = li.inflate(R.layout.list_item, null); 
    } 

    Item elem = elems.get(position); 
    TextView mainText = (TextView) convertView.findViewById(R.id.main_text); 
    TextView sideText = (TextView) convertView.findViewById(R.id.side_text); 

    mainText.setText(elem.desc); 
    sideText.setText(timestampToString(elem.date)); 

    Button againButton = (Button) convertView 
      .findViewById(R.id.itemAgainButton); 

    againButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // onClick actions 
     } 
    }); 

现在的onClick方法内我需要存取权限从当前行创建项目对象。我不确定是否清楚我想要做什么。这里我设置上的ListView元素听众在我的活动类

lista.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 

      Item item = (Item) parent.getItemAtPosition(position); 
      Intent i = new Intent(getApplicationContext(), 
        DidItItemActivity.class); 
      i.putExtra("id", item.id); 
      startActivity(i); 
     } 
    }); 

,我可以使用parent.getItemAtPosition(position)这给了我正是我需要的。我怎么能在Adapter类中做同样的事情?

回答

0

好吧,首先,你应该在getView方法来初始化LayoutInflater。更适合做这件事的地方是适配器的构造函数。因为构造函数只被调用一次,getView方法将被调用很多次。

现在让我们去你的主要问题。您不应该在适配器类中调用onClick方法,而是在活动中调用。为此,您可以使用给定视图的设置标签。要实现这一点,你首先需要声明的适配器类

public static class ViewHolder { 
    int mId; 
} 

内部类然后,你要适当的ID设置每个标签,将与视图进行绑定。 像这样

public View getView(int position, View convertView, ViewGroup parent) { 

if (convertView == null) { 
    ... 
    ViewHolder tag = new ViewHolder(); 
    convertView.setTag(tag); 
} 

Item elem = elems.get(position); 
... 

ViewHolder tag = (ViewHolder) view.getTag(); 
tag.mId = elem.id; 
... 
} 

最后一部分是有关的onClick方法得到的值id。当onClick函数叫你只需要调用getTag方法上给出的观点:

public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 

       ViewHolder tag = (ViewHolder) view.getTag(); 
       int id = tag.mId; 
       } 

而最后一件事,设置onClickListener是更好地做NewView的方法。