0

ListViewを使用してアクティビティを作成します。今私が知りたいのは、私のコードを単純化する(短くする)ことは可能ですか?

例はコードブロックの下にあります

package de.bodprod.dkr;

import java.util.ArrayList;
import java.util.HashMap;


import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;

public class MediMenue extends ListActivity {
    ArrayList<HashMap<String, Object>> medi_menue_items;
    LayoutInflater inflater;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.medi_menue);
        ListView antidotListView = (ListView) findViewById(android.R.id.list);
        inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);        


        medi_menue_items = new ArrayList<HashMap<String,Object>>();

        HashMap<String , Object> item = new HashMap<String, Object>();
        item.put("title", "Antidots");
        item.put("desc", "Toxine und die Gegenmittel");
        item.put("class_open", "MediAntidotList");
        medi_menue_items.add(item);

        item = new HashMap<String, Object>();
        item.put("title", "Notfallmedikamente");
        item.put("desc", "Dosierungen, Gegenanzeigen u.v.m.");
        item.put("class_open", "MediNotmediList");
        medi_menue_items.add(item);

        ListView lv;
        lv = (ListView) findViewById(android.R.id.list); 
        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent in = new Intent();
                String class_open = ((TextView) view.findViewById(R.id.class_open)).getText().toString();
                if(class_open.equals("MediAntidotList")){
                    in = new Intent(getApplicationContext(), MediAntidotList.class);
                }else if(class_open.equals("MediNotmediList")){
                    in = new Intent(getApplicationContext(), MediNotmediList.class);
                }
                startActivity(in);

            }
        });     

        final CustomAdapter adapter = new CustomAdapter(this, R.layout.medi_menue, medi_menue_items);
        antidotListView.setAdapter(adapter);            

    }
    private class CustomAdapter extends ArrayAdapter<HashMap<String, Object>>{
        public CustomAdapter(Context context, int textViewResourceId, ArrayList<HashMap<String, Object>> Strings) {
            super(context, textViewResourceId, Strings);
        }
        private class ViewHolder{
            TextView class_open, title, desc;
        }
        ViewHolder viewHolder;

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if(convertView==null){        
                convertView=inflater.inflate(R.layout.medi_menue_item, null);
                viewHolder=new ViewHolder();
                viewHolder.class_open=(TextView) convertView.findViewById(R.id.class_open);
                viewHolder.title=(TextView) convertView.findViewById(R.id.medi_menue_name);
                viewHolder.desc=(TextView) convertView.findViewById(R.id.medi_menue_desc);
                convertView.setTag(viewHolder);
            }else{
                viewHolder=(ViewHolder) convertView.getTag();
            }
            viewHolder.class_open.setText(medi_menue_items.get(position).get("class_open").toString());
            viewHolder.title.setText(medi_menue_items.get(position).get("title").toString());
            viewHolder.desc.setText(medi_menue_items.get(position).get("desc").toString());
            return convertView;
        }
    }   
} 

例:OnItemClickListenerで、リストアイテムからIDを取得し、ifおよびelseで使用します。しかし、IDはアクティビティの名前と同じです。新しいインテントは、文字列class_openにある名前でクラスを開く必要があると言うことができますか?このようなもの:

        String class_open = ((TextView) view.findViewById(R.id.class_open)).getText().toString();
        Intent in = new Intent(getApplicationContext(), <class_open>.class);
        startActivity(in);
4

2 に答える 2

0

まず、ListActivityを使用しているため、リスト自体でsetOnListItemClickハンドラーを呼び出す必要はなく、ListActivityからこのメソッドをオーバーライドするだけです。

protected void onListItemClick(ListView l, View v, int position, long id);

だからあなたはこれを持つことができます:

protected void onListItemClick(ListView l, View v, int position, long id) {
    Intent in = new Intent();
    String class_open = ((TextView)v.findViewById(R.id.class_open)).getText().toString();
    if(class_open.equals("MediAntidotList")){
                in = new Intent(getApplicationContext(), MediAntidotList.class);
            }else if(class_open.equals("MediNotmediList")){
                in = new Intent(getApplicationContext(), MediNotmediList.class);
            }
    startActivity(in);

}

次に、他の質問に答えるために、Javaリフレクションを試してクラスを取得できます。

String class_open = ((TextView)view.findViewById(R.id.class_open)).getText().toString();
Class c = Class.forName("com.yourpackagename." + class_open );
Intent in = new Intent(getApplicationContext(), c);
于 2012-07-08T00:50:22.410 に答える
0

私はこれを自分で試したことがないので、ここでロングショットをします。しかし、表示されていないViewHolderクラスを取得したようです。本当にuronItemClickコードを変更したい場合は、getView(...)で設定されているすべてのViewHolderにインテントを保存できます。このようにして、onItemClickでビューホルダータグを取得し、そのタグからインテントを取得して開始できます。

例:

public void onItemClick(AdapterView<?> parent, View view, int position, long id)
 {
    // Get the intent that u stored in this viewholder
    ViewHolder clicked = (ViewHolder)view.getTag();
    Intent toStart = clicked.getIntent();
    startActivity(toStart);          
 }

また、ListActivityから拡張しているため、onItemClickリスナーを設定する必要はありません。オーバーライドするだけです。

これをすべて実装するには、アダプタのgetView()でいくつかの変更を行う必要があります。あなたは何を理解できると確信しています!

于 2012-07-08T01:36:26.547 に答える