【问题标题】:How Can I open a new activity when an ImageButton is clicked on in the listview?在列表视图中单击 ImageButton 时如何打开新活动?
【发布时间】:2015-12-02 18:52:46
【问题描述】:

如何在列表视图中单击 ImageButton 时打开新活动?目前我的 OnClickListener 在我的 ArrayAdapter 类中,但我无法从那里开始新的活动。那么如何在 MainActivity 中获取 OnClickListener 以及如何处理“名称”和“ID”?

这是我的 ArrayAdapter:

public class MessageArrayAdapter extends ArrayAdapter<MessageHome> {

private TextView playername;
private ImageView profile;
private ImageButton chat;
private List<MessageHome> MessageList = new ArrayList<MessageHome>();
private LinearLayout singleMessageContainer;

@Override
public void add(MessageHome object) {
    MessageList.add(object);
    super.add(object);
}

public MessageArrayAdapter(Context context, int textViewResourceId) {
    super(context, textViewResourceId);
}


public int getCount() {
    return this.MessageList.size();
}

public MessageHome getItem(int index) {
    return this.MessageList.get(index);
}

public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    if (row == null) {
        LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.activity_chat_singlemessage, parent, false);
    }
    singleMessageContainer = (LinearLayout) row.findViewById(R.id.singleMessageContainer);
    MessageHome chatMessageObj = getItem(position);
    playername = (TextView) row.findViewById(R.id.playername_);
    playername.setText(chatMessageObj.name);
    final String ID = chatMessageObj.ID;
    final String name = chatMessageObj.name;
    profile = (ImageView) row.findViewById(R.id.imageView2);
    if(chatMessageObj.newm == 1)
        profile.setImageResource(R.drawable.player);
    else
        profile.setImageResource(R.drawable.player2);

    chat = (ImageButton) row.findViewById(R.id.ib_message);
    chat.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.e("log_tag",name+ID);
            // Here start new activity, but doesn't work here

        }
    });

    return row;
}

}

这是我的 MainActivity:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent i = getIntent();
    setContentView(R.layout.activity_message);

    listView = (ListView) findViewById(R.id.listView1);

    messageArrayAdapter = new MessageArrayAdapter(getApplicationContext(), R.layout.activity_message_single);
    listView.setAdapter(messageArrayAdapter);

    listView.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
    listView.setAdapter(messageArrayAdapter);

    //to scroll the list view to bottom on data change
    messageArrayAdapter.registerDataSetObserver(new DataSetObserver() {
        @Override
        public void onChanged() {
            super.onChanged();
            listView.setSelection(messageArrayAdapter.getCount() - 1);
        }
    });
}

感谢您的帮助;)

【问题讨论】:

  • OnClickListener 在我的 ArrayAdapter 类中,但我无法从那里开始新活动 为什么?

标签: android listview android-listview android-arrayadapter listactivity


【解决方案1】:

所有Views 都有一个Context

chat.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.e("log_tag",name+ID);
        Intent intent = new Intent(v.getContext(), NextActivity.class);
        v.getContext().startActivity(intent);
    }
});

【讨论】:

    【解决方案2】:

    尝试将以下行放入您的 activity_chat_singlemessage.xml

    android:onClick="nameOfFunction"
    

    并将此功能放入您的活动中

     public void nameOfFunction(final View view){
          startActivity(new Intent(this, YourNewActivity.class));
     }
    

    【讨论】:

      【解决方案3】:

      在适配器中:

      private Context context;
      public MessageArrayAdapter(Context context, int textViewResourceId) {
          super(context, textViewResourceId);
        this.context = context;
      }
      

      在你的听众中:

         context.startActivity(new Intent(context,YourNewActivity.class));
      

      【讨论】:

        【解决方案4】:

        我认为您有一些问题。但首先,您的适配器中只有一个图像按钮实例。因此,我认为只有列表中的最后一项将绑定图像按钮。 您应该为列表中的每个项目创建一个视图持有者,因为您需要将事件绑定到列表中的每个项目,以便将项目的索引与该视图持有者一起存储。所以创建一个内部类(我正在删除你的一些细节):

        public static class ViewHolder{
            public TextView playerName;
            public ImageButton profileButton;
        }
        

        在您的 adpater 中,getView 属性处理 viewHolder:

        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder row;
            if (convert View == null) {
                LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                row = inflater.inflate(R.layout.activity_chat_singlemessage, parent, false);
                row.playerName = (TextView) row.findViewById(R.id.playername_);
                row.profileButton = (ImageButton)   row.findViewById(R.id.ib_message);
                convertView.setTag(row);
            } else row = (ViewHolder) convertView.GetTag();
           row.setText(chatMessageObj.name);
           row.profileButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.e("log_tag",name+ID);
                    Intent intent = new Intent(v.getContext(), NextActivity.class);
                    v.getContext().startActivity(intent);
                }
            });
        

        希望足以让你继续前进。 (从 asadmshah 复制意图代码)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-18
          • 2020-04-10
          相关资源
          最近更新 更多