问题
I have a list on which i Want to give on-click event on radio-button of each row in the list.But this code is not working. Giving force close.Please can anyone me help out.I am new to this.
package com.example.radiogroup;
import java.util.ArrayList;
import java.util.HashMap;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.app.Activity;
import android.content.Context;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Checkable;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;
import android.os.Build;
public class MainActivity extends Activity implements Checkable
{
private ArrayList<HashMap<String,Object>> data;
private ListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv=(ListView)findViewById(R.id.listView1);
lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
data=new ArrayList<HashMap<String, Object>>();
prepareListData();
adapter = new ListAdapter(this,data);
lv.setAdapter(adapter);
/* lv.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id)
{
{
if(position==0)
{
Toast.makeText(getApplicationContext(), "Move forward",
Toast.LENGTH_SHORT).show();
}
}
}
}); */
}
private void prepareListData()
{
HashMap<String,Object> row1=new HashMap<String,Object>();
row1.put("ID",1 );
row1.put("NAME","Taj Mahal");
data.add(row1);
HashMap<String,Object> row2=new HashMap<String,Object>();
row2.put("ID",2 );
row2.put("NAME","Agra Fort");
data.add(row2);
HashMap<String,Object> row3=new HashMap<String,Object>();
row3.put("ID",3 );
row3.put("NAME","Ram Baugh");
data.add(row3);
HashMap<String,Object> row4=new HashMap<String,Object>();
row4.put("ID",4 );
row4.put("NAME","Panch Mahal");
data.add(row4);
HashMap<String,Object> row5=new HashMap<String,Object>();
row5.put("ID",5 );
row5.put("NAME","Musamman Burj");
data.add(row5);
}
class ListAdapter extends BaseAdapter
{
private Context context;
private ArrayList<HashMap<String,Object>> list;
ViewHolder holder;
public ListAdapter(Context context,ArrayList<HashMap<String,Object>> list){
this.context = context;
this.list = list;
holder.rb.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
Toast.makeText(getApplicationContext(), "Move forward", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
if(convertView == null){
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.row,null,false);
holder.rb = (RadioButton) convertView.findViewById(R.id.radioButton1);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.rb.setText(list.get(position).get("NAME").toString());
return convertView;
}
class ViewHolder
{
RadioButton rb;
}
}
@Override
public void setChecked(boolean checked) {
// TODO Auto-generated method stub
}
@Override
public boolean isChecked() {
// TODO Auto-generated method stub
return false;
}
@Override
public void toggle() {
// TODO Auto-generated method stub
}
}
回答1:
in constructor of ListAdapter class you have not initialize ViewHolder object so you cann't access member of that class. remove
holder.rb.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
Toast.makeText(getApplicationContext(), "Move forward", Toast.LENGTH_SHORT).show();
}
});
from ListAdapter constructor and put it in getView() after class and member initialise.
after
if(convertView == null){
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.row,null,false);
holder.rb = (RadioButton) convertView.findViewById(R.id.radioButton1);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
in getView method.
回答2:
USe it on getview Methed on Adapter
holder.rb.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Toast.makeText(getApplicationContext(), "Move forward", Toast.LENGTH_SHORT).show();
}
});
Use it on OnCreate Methed
lv.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id)
{
{
if(position==0)
{
Toast.makeText(getApplicationContext(), "Move forward "+position, Toast.LENGTH_SHORT).show();
}
else
if(position==1)
{
Toast.makeText(getApplicationContext(), "Move forward "+position,
Toast.LENGTH_SHORT).show();
}
}
}
});
来源:https://stackoverflow.com/questions/25683263/onclick-event-on-radiobutton-not-working