7

拡張ベースアダプターでクリックイベントボタンを使用する方法..私はたくさん試しましたが、使用しません..私のプロジェクトにはカスタムリストビューがあり、テキスト、ボタン(btnlist)、高速スクロールインデックスが含まれています。ボタンをクリックすると(btnlist)、他のアクティビティに移動しません。エラーも表示されず、トーストも表示されません..
例を教えてください。よろしくお願いします。

クイック リファレンス: getview---> holder.btnList.setOnClickListener

EfficientAdapter.java

public class EfficientAdapter extends BaseAdapter implements SectionIndexer, OnClickListener {
IndexableListView mListView;
private String mSections = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ";
ArrayList<Patient> patientListArray;

private Intent intent;
private Patient patient;
private LayoutInflater mInflater;
private Context context;
private int positions;
ViewHolder holder;


public EfficientAdapter(Context context) {
    mInflater = LayoutInflater.from(context);
    this.context = context;

    String patientListJson = CountriesList.jsonData;
    JSONObject jssson;
    try {
        jssson = new JSONObject(patientListJson);
        patientListJson = jssson.getString("PostPatientDetailResult");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    Gson gson = new Gson();
    JsonParser parser = new JsonParser();
    JsonArray Jarray = parser.parse(patientListJson).getAsJsonArray();
    patientListArray = new ArrayList<Patient>();
    for (JsonElement obj : Jarray) {
        Patient patientList = gson.fromJson(obj, Patient.class);
        patientListArray.add(patientList);
    //  Log.i("patientList", patientListJson);

    }
}


public int getCount() {

    return patientListArray.size();
}

public Object getItem(int position) {

    return position;
}

public long getItemId(int position) {
    return position;
}

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

    this.positions = position;      
    View rowView = convertView;

    if (rowView  == null) {                     
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView = inflater.inflate(R.layout.homemplebrowview, parent, false);

        holder = new ViewHolder();
        holder.text1 = (TextView) rowView.findViewById(R.id.name);
        holder.text2 = (TextView) rowView.findViewById(R.id.mrn);
        holder.text3 = (TextView) rowView.findViewById(R.id.date);
        holder.text4 = (TextView) rowView.findViewById(R.id.age);
        holder.text5 = (TextView) rowView.findViewById(R.id.gender);
        holder.text6 = (TextView) rowView.findViewById(R.id.wardno);
        holder.text7 = (TextView) rowView.findViewById(R.id.roomno);
        holder.text8 = (TextView) rowView.findViewById(R.id.bedno);
        holder.btnList = (Button) rowView.findViewById(R.id.listbutton);
        /*Button editButton = (Button) rowView.findViewById(R.id.listbutton) ;
        editButton.setTag(position);
        editButton.setClickable(true);
        editButton.setOnClickListener(EfficientAdapter.this);
        rowView.setClickable(true);*/


        rowView.setTag(holder);
    } else {
        holder = (ViewHolder) rowView.getTag();
    }

    holder.text1.setText(Util.formatN2H(patientListArray.get(position)
            .getName()));
    holder.text2.setText(patientListArray.get(position).getMrnNumber());
    holder.text3.setText(Util.formatN2H(patientListArray.get(position)
            .getRoom()));
    holder.text4.setText(Util.formatN2H(patientListArray.get(position)
            .getAge()));
    holder.text5.setText(Util.formatN2H(patientListArray.get(position)
            .getGender()));
    holder.text6.setText(Util.formatN2H(patientListArray.get(position)
            .getWard()));
    holder.text7.setText(Util.formatN2H(patientListArray.get(position)
            .getRoom()));
    holder.text8.setText(Util.formatN2H(patientListArray.get(position)
            .getBed()));        
    holder.btnList.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            Toast.makeText(context, "STAT", Toast.LENGTH_SHORT).show();     
            Intent next = new Intent(context, SeviceDetails.class);
            Log.i("patient", " next "+ position + " onclickposition " + patientListArray.get(position).getMrnNumber());
            patient = getPatientDetailsByMrn(patientListArray, position);
            Log.i("DDDD ", patient.getMrnNumber());             
            next.putExtra("patient", patient);
            next.putExtra("position", position);
            System.out.println("patient"+ patient);
            context.startActivity(next);
        }
    });
return rowView;
}       

static class ViewHolder {
    public Button btnList;
    public TextView text8;
    public TextView text7;
    public TextView text6;
    public TextView text5;
    public TextView text4;
    public TextView text1;
    public TextView text2;
    public TextView text3;
}

@Override
public void notifyDataSetChanged() {
    super.notifyDataSetChanged();
}

public int getPositionForSection(int section) {
    sortMyData();

    Log.i("getPositionForSection", "section" + section);
    // If there is no item for current section, previous section will be
    // selected
    for (int i = section; i >= 0; i--) {
        for (int j = 0; j < getCount(); j++) {
            if (i == 0) {

                Log.i("getPositionForSection- i", "section" + i);
                // For numeric section
                for (int k = 0; k <= 9; k++) {

                    if (StringMatcher.match(
                            String.valueOf(patientListArray.get(j)
                                    .getName().charAt(0)),
                            String.valueOf(k)))
                        Log.i("getPositionForSection- j", "section" + j);

                        return j;
                }
            } else {
                if (StringMatcher.match(
                        String.valueOf(patientListArray.get(j).getName()
                                .charAt(0)),
                        String.valueOf(mSections.charAt(i))))
                    return j;
            }
        }
    }
    return 0;
}

public int getSectionForPosition(int position) {
    return 0;
}

public Object[] getSections() {
    String[] sections = new String[mSections.length()];
    for (int i = 0; i < mSections.length(); i++)
        sections[i] = String.valueOf(mSections.charAt(i));
    return sections;
}

/**
 * sorting the patientListArray data
 */
public void sortMyData() {
    // sorting the patientListArray data
    Collections.sort(patientListArray, new Comparator<Object>() {
        @Override
        public int compare(Object k1, Object k2) {
            Patient p1 = (Patient) k1;
            Patient p2 = (Patient) k2;
            return p1.getName().compareToIgnoreCase(p2.getName());
        }

    });
}


     }

.xml

  <Button
        android:id="@+id/listbutton"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@+id/name"
        android:layout_marginRight="43dp"   
        android:focusable="false"      
        android:text="Episode"
        android:textColor="#666666" />

デフォルトのリストビュー

       <ListView 

         android:id="@+id/homelistView"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:dividerHeight="0dip" />
4

4 に答える 4

6

アダプターを使用して、リストにアイテムを入力する必要があります。次に、アクティビティまたはフラグメントonListItemClickで、リスト項目のクリックを処理するイベントを実装する必要があります。

編集:私が使用している以下の例を投稿していますListFragment-これは私が現在利用できるコードの一部ですListView。後で特定のものを投稿できます:

public class RecipiesActivity extends FragmentActivity {

    private RecipiesSummaryListAdapter m_listAdapter; 

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        /* here you need to set the adapter of the listview 
           and do other things for your applicaiton (i.e. populate the 
           data in your adapter. In your case, since you are calling a 
           WS you want to do that in a different task */ 
        ListFragment lf = 
             (ListFragment) fm.findFragmentById(R.id.my_list_fragment);
        lf.setListAdapter(m_listAdapter);
}

次に、あなたのListFragment

/* imports and other things go here then... */ 
public class MyListFragment extends ListFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        return (View) inflater.inflate(R.layout.myListViewXml, 
                                           container, false);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // put your handler here

    }   
}

詳しくはこちらをListFragmentご覧ください

非常に良い例だと思います(ただし、このスタックオーバーフローの回答では、ArrayAdapterの代わりに拡張することで.BaseAdapter

覚えておくべき点が 1 つあります。

  1. ボタンはフォーカス可能であってはなりません (つまり、XML の使用ではandroid:focusable="false"- XML のように)。
  2. 以下に示すように処理されるイベントをキャプチャする必要がありonItemClickます (上記のリンクからの抜粋)。

コード:

listview.setOnItemClickListener(new OnItemClickListener() {
    //@Override
    public void onItemClick(AdapterView arg0, View view,
                                  int position, long id) {
        // user clicked a list item, make it "selected"
        selectedAdapter.setSelectedPosition(position);
        //Do your stuff here
}

最後に、注意点を一つ。この解決策は、リスト行をクリックするとイベントが発生することを意味します。

ユーザーにボタンをクリックしてイベントを発生させたい場合はlistview.setItemsCanFocus(true)、ListView XML を膨らませた直後に呼び出しを設定し、ボタンが XML にあることを確認する必要があると思いfocusableます。その場合、イベントのリッスンは機能するonClickはずです。

これについては、GoogleIO World of ListView プレゼンテーションのスライド 25 で説明されています (ここで入手できビデオはここにあります) 。

お役に立てれば

于 2012-10-01T11:40:30.923 に答える
3

条件のholder.btnList.setOnClickListener中にif (rowView == null)書き込んで、もう一度やり直してください。

于 2012-10-01T12:12:57.747 に答える
3

ボタンに対して次のことを試してください。

android:focusable="false"
于 2012-10-01T11:53:00.127 に答える
2

getView()メソッドで次のコードを使用します。

    Button status = (Button) rowView.findViewById(R.id.image1);
        status.setBackgroundResource(R.drawable.add_account);
        status.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                       // DO your stuff
            }
        });
于 2012-10-01T11:37:32.387 に答える