2

次のような 2 列の行レイアウトがあります。

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:paddingTop="4dip"
     android:paddingBottom="6dip"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:textSize="13sp">

     <TextView android:id="@+id/TRAIN_CELL"
         android:layout_width="275dip"
         android:layout_height="wrap_content"/>

  <ImageView android:id="@+id/TO_CELL"
         android:layout_width="25dip"
         android:layout_height="wrap_content"  
         android:layout_weight="1"
         android:gravity="center"
         android:src="@drawable/arrow_button"/>

</LinearLayout>

データベースからアイテムを取得したら、左の列に表示し、右の列には、クリック可能なアイテムであることを示す矢印が付いた小さな画像を表示します。しかし、画像をレンダリングする方法がわかりません。現在、そのリストにデータを入力する方法は次のとおりです。

次の 2 つの変数があります。

private List<HashMap<String, String>> fillMaps;
private SimpleAdapter adapter;

最初に、次のように設定しました。

list = (ListView) findViewById(android.R.id.list);

ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
//HashMap<String, String> map = new HashMap<String, String>();

// My data
fillMaps = new ArrayList<HashMap<String, String>>();

adapter = new SimpleAdapter(this, fillMaps, R.layout.questions_list,
        new String[] {"train", "to"}, 
        new int[] {R.id.TRAIN_CELL,  R.id.TO_CELL});
// This was the middle item R.id.FROM_CELL,

list.setAdapter(adapter);       
list.setTextFilterEnabled(true);

データがサーバーから戻ってきたら、次のようにリストに入力します。

if ( obj != null )
                        {
                            questions.clear();

                            for ( int i = 0; i < obj.length(); i++ )
                            {
                                HashMap<String, String> map = new HashMap<String, String>();
                                JSONObject o = obj.getJSONObject(i);

                                question_id = o.getString("question_id");
                                question = o.getString("question");
                                question_by_member_id = o.getString("member_id");

                                Question q = new Question ( );
                                q.setQuestion( question );                      
                                q.setQuestionId( question_id );
                                q.setQuestionByMemberId(question_by_member_id);

                                map.put("train", question);

                                //map.put("from", ">");
                                //map.put("to", ">");

                                fillMaps.add(map);
                                questions.add( q );                             
                            }

                            adapter.notifyDataSetChanged();
                        }

しかし、レンダリングするイメージが得られません。問題の一部は、リストが期待するデータとして文字列を使用していることだと思いますが、画像でこれを処理する方法がわかりません。ちなみに画像はいつも同じ画像です。

ありがとう!!:)

4

4 に答える 4

2

これは、あなたの望むことですか?

<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:paddingTop="4dip"
     android:paddingBottom="6dip"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:textSize="13sp">

     <TextView android:id="@+id/TRAIN_CELL"
         android:layout_width="275dip"
         android:layout_height="wrap_content"/>

     <ImageView android:id="@+id/TO_CELL"
         android:layout_width="25dip"
         android:layout_height="wrap_content"  
         android:layout_weight="1"
         android:gravity="center"
         android:src="@drawable/arrow_button"/>

</LinearLayout>

追加
(申し訳ありませんが、通知が一晩中積み重なると通知を見逃すことがあります。受信トレイのように、Stack Overflowでメッセージを読んだり通知を削除したりできるはずです...)

とにかく、TO_CELLの画像が常に同じになる場合は、XMLでのみ画像を設定するだけです。SimpleAdapterを次のように変更します。

adapter = new SimpleAdapter(this, fillMaps, R.layout.questions_list,
        new String[] {"train"}, 
        new int[] {R.id.TRAIN_CELL});

これで、アダプタは1つの文字列のみを処理するようになり、ArrayAdapterに簡略化できます(必要な場合)。


簡略化した例
次のように、1つのTextViewを表示して、小さな「次の」矢印を表示することもできます。

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:drawableRight="@android:drawable/ic_media_play"
    android:padding="10sp"
    android:textAppearance="?android:attr/textAppearanceMedium" />

(LinearLayoutと個別のImageViewは厳密には必要ありません。これをとして保存しましたlist_item.xml。)これは簡単なプレビューです。重要でない行の多くを繰り返しないように残したことを理解してください。

public class Example extends Activity {
    ArrayAdapter<String> adapter;
    List<String> list = new ArrayList<String>();
    ListView listView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.text, list);
        listView = (ListView) findViewById(R.id.list);
        listView.setAdapter(adapter);

        updateList();
    }

    public void updateList() {
        ...
        if ( obj != null ) {
            questions.clear();
            list.clear();

            for ( int i = 0; i < obj.length(); i++ ) {
                JSONObject o = obj.getJSONObject(i);
                ...
                question = o.getString("question");
                list.add(question);
            }

            adapter.notifyDataSetChanged();
        }
    }
}

お役に立てれば!

于 2012-09-06T20:14:32.917 に答える
2

最も簡単な方法は、SimpleAdapter を使用する代わりに、必要に応じて ArrayAdapter を拡張することだと思います。getView() メソッドをオーバーライドして、必要な方法でリストを作成できます!

herehere、およびhereにいくつかの例があります。

編集

まず、xml をいくつか変更する必要があります。

<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:paddingTop="4dip"
 android:paddingBottom="6dip"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:orientation="horizontal"
 android:textSize="13sp">

     <TextView android:id="@+id/TRAIN_CELL"
     android:layout_width="275dip"
     android:layout_height="wrap_content"/>

 <ImageView android:id="@+id/TO_CELL"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:gravity="center"              
     android:background="#fff"/>
</LinearLayout>

次のコードでは、わかりやすくするために文字列の ArrayList を使用しました。これを、リストに入力するために使用しているオブジェクトのリストに置き換える必要があります。(多分質問?)

ExtendedAdapter を作成し、 getView() メソッドをオーバーライドして、意図したとおりに実行します。これにより、リストの各行に TextView と ImageView が作成され、TextView に ArrayList アイテムのアイテムが入力され、アイテムがクリック可能な場合は画像が表示されます。(自分で検証を行う必要がありますが、理解するのは難しくありません)

public class ExtendedAdapter extends BaseAdapter {

public static final String TAG = "TodoAdapter";

private Context mContext;
private int layoutResource;
private boolean clickable = false;
private List<String> items; // you can replace this list with whathever you need
                            // for simplicity i'm assuming you already have the strings 
                            // you need for the textviews

public ExtendedAdapter(Context context, int textViewResourceId,
        List<String> items) {
    this.items = items;
    this.mContext = context;
    this.layoutResource = textViewResourceId;
}

public int getCount() {
    return items.size();
}

public Object getItem(int position) {
    return position;
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(layoutResource, null);
    }

    ImageView arrow = (ImageView) v.findViewById(R.id.TO_CELL);
    TextView text = (TextView) v.findViewById(R.id.TRAIN_CELL);
    text.setText(items.get(position));
    if (clickable)  // here you have to do your check if it's clickable or not
        arrow.setBackgroundResource(R.drawable.ic_launcher);
    return v;
}
}

そしてあなたの活動では、リストアダプターを設定するだけです

public class MainActivity extends Activity {

ListView yourList;
ArrayList<String> itemList = new ArrayList<String>();
ExtendedAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    yourList = (ListView) findViewById(R.id.yourList);



    adapter = new ExtendedAdapter(this, R.layout.row_layout, itemList);
    yourList.setAdapter(adapter);
    updateItems();
}

public void updateItems(){
    //dummy method, you should fetch your data and populate your array in a separate thread 
    //or something
    itemList.add("Text 1");
    itemList.add("Text 2");
    itemList.add("Text 3");
    itemList.add("Text 4");
    itemList.add("Text 5");
    itemList.add("Text 6");     
    adapter.notifyDataSetChanged();
}     


}

これが、テキストと画像を含むリストを作成する方法です。

幸運を!

于 2012-09-17T02:20:30.563 に答える
0

リストアダプタをカスタマイズする必要があると思います。そうすれば簡単になります。

于 2012-09-17T06:15:01.257 に答える
0

問題は、レイアウトと単純なアダプターにあります。

1.linearLayoutandroid:textSize="13sp"を使用しないでくださいTextViewに使用し、

以下のコードを使用できます

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:paddingBottom="6dip"
    android:paddingTop="4dip" >

    <TextView
        android:id="@+id/TRAIN_CELL"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight=".25"
        android:text="try out by yourself..."
        android:textSize="13sp" />

    <ImageView
        android:id="@+id/TO_CELL"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight=".05"
        android:gravity="center"
        android:src="@android:drawable/arrow_down_float" />

</LinearLayout>

2.問題はSimpleAdapterの使用にあります

adapter = new SimpleAdapter(this, fillMaps, R.layout.questions_list, new String[] {"train"}, new int[] {R.id.TRAIN_CELL});

于 2012-09-18T06:03:08.020 に答える