0

Web サービスから取得したレコードを表示するアプリがあります。このレコードには、startTime、duration、status、clientname の 5 つのフィールドがあります。(clientname は、実際には first と last の 2 つのフィールドで構成されています)。arrayList から String 配列にフィールドを取得し、その配列をアダプターに渡すことができます。フィールドが ListView に表示されます。これまでのところ、同じレコードが ListView に 5 回表示されていることを除けば、すべて問題ありません。どうしてこれなの?配列を一度アダプターに渡します。

public class GetRota extends Activity {

    private static final String TAG = GetRota.class.getSimpleName();
    ListView listView;
    Intent intent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.getrotalayout);

        listView = (ListView)findViewById(R.id.rotalist);
        intent = this.getIntent();
        Bundle bundle = intent.getBundleExtra("rotaArrayBundle");

        @SuppressWarnings("unchecked")
        ArrayList array =  (ArrayList) bundle.get("rotaArray");





        for(int i = 0; i < array.size(); i++){

             Log.e(TAG, "array pos " + i + " = " +  array.get(i));

        }

        String record = array.get(0).toString();
        String[] itemsInRecord = record.split(",");
        String[] recordItem = new String[5];

       for(int x = 0; x < itemsInRecord.length; x++){

           Log.e(TAG, "token = " + itemsInRecord[x]);
           recordItem[x] = itemsInRecord[x];
      }

       MySimpleArrayAdapter arrayAdapter = new MySimpleArrayAdapter(this, recordItem);
       listView.setAdapter(arrayAdapter);


    }// end of onCreate


    private class MySimpleArrayAdapter extends ArrayAdapter<String> {
          private final Context context;
          private final String[] values;

          public MySimpleArrayAdapter(Context context, String[] values) {
            super(context, R.layout.rotarowlayout, values);
            this.context = context;
            this.values = values;
          }

          @Override
          public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View rowView = inflater.inflate(R.layout.rotarowlayout, parent, false);
           TextView startTime = (TextView)rowView.findViewById(R.id.rowstarttime);
           TextView duration = (TextView)rowView.findViewById(R.id.rowduration);
           TextView status = (TextView)rowView.findViewById(R.id.rowstatus);
           TextView name = (TextView)rowView.findViewById(R.id.rowclientname);

           startTime.setText("Start Time: " + values[0]);
           duration.setText("Duration:" + values[1]);
           status.setText("Status:" + values[2]);
           name.setText("Client:" + values[3] + values[4]);



            return rowView;
          }
        } 

}// end of GetRota

. [アップデート]

private class MySimpleArrayAdapter extends BaseAdapter {
          private final Context context;
          private final ArrayList array;

          public MySimpleArrayAdapter(Context context, ArrayList array) {
            this.context = context;
            this.array = array;
          }

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

        public Object getItem(int position) {
            return array.get(position);
        }

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

          @Override
          public View getView(int position, View convertView, ViewGroup parent) {
            String[] values = array.get(position).toString();
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View rowView;

            if (convertView == null) { // if it's not recycled, initialize some
                                    // attributes
                rowView = new View(context);
                // get layout from gridview_item.xml
                rowView = inflater.inflate(R.layout.rotarowlayout, parent, false);
            } else {
                rowView = (View) convertView;
            }


           TextView startTime = (TextView)rowView.findViewById(R.id.rowstarttime);
           TextView duration = (TextView)rowView.findViewById(R.id.rowduration);
           TextView status = (TextView)rowView.findViewById(R.id.rowstatus);
           TextView name = (TextView)rowView.findViewById(R.id.rowclientname);

           startTime.setText("Start Time: " + values[position][0]);
           duration.setText("Duration:" + values[position][1]);
           status.setText("Status:" + values[position][2]);
           name.setText("Client:" + values[position][3] + values[position][4]);




            return rowView;
          }
        } 

【ヒテ更新】

private class MySimpleArrayAdapter extends ArrayAdapter<String> {
        private final Context context;
        private final ArrayList<String[]> list;

        public MySimpleArrayAdapter(Context context,ArrayList<String[]> list) 
        {      

        super(context, R.layout.rotarowlayout);
         Log.e(TAG, "inside adapter constructor");
                this.context = context;           
                this.list= list;
              }

              @Override
              public View getView(int position, View convertView, ViewGroup parent) {
                  Log.e(TAG, "inside getView");
                LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

               View rowView = inflater.inflate(R.layout.rotarowlayout, parent, false);

               TextView startTime = (TextView)rowView.findViewById(R.id.rowstarttime);
               TextView duration = (TextView)rowView.findViewById(R.id.rowduration);
               TextView status = (TextView)rowView.findViewById(R.id.rowstatus);
               TextView name = (TextView)rowView.findViewById(R.id.rowclientname);

               String[] values = list.get(position);

               startTime.setText("Start Time: " + values[0]);
               Log.e(TAG, "starttime = " + startTime);
               duration.setText("Duration:" + values[1]);
               status.setText("Status:" + values[2]);
               name.setText("Client:" + values[3] + values[4]);



                return rowView;

              }


              @Override
              public int getCount() {
                  return this.list.size();
              }

    }// end of adapter class
4

2 に答える 2

1

split() を使用して、各レコードを文字列の配列に変換しています。

String[] itemsInRecord = record.split(",");

これが 1 つのレコードの場合、レコードの配列は 2 次元である必要があります。しかし、レコードの配列は 1 次元です。

String[] recordItem = new String[5];

これはアダプタに渡されます。アダプタは、おそらく の各インデックスの行を作成していますvalues。各位置について、getView()メソッドは毎回同じ 5 つの値を読み取っています。

startTime.setText("Start Time: " + values[0]);
duration.setText("Duration:" + values[1]);
status.setText("Status:" + values[2]);
name.setText("Client:" + values[3] + values[4]);

したがって、データには 2 つのディメンションが必要です。リスト アイテムの数と、各アイテムのフィールドです。現在のコードは両方と同じディメンションを使用しているため、同じレコードのコピーが 5 つ表示されます。

String[][] recordItem = new String[numRecords][5];
/* ... */
startTime.setText("Start Time: " + values[position][0]);
duration.setText("Duration:" + values[position][1]);
status.setText("Status:" + values[position][2]);
name.setText("Client:" + values[position][3] + values[position][4]);

すでに持っているので、元ArrayListのレコードを使用してアダプターに渡すことをお勧めします。定義したクラスとしてレコードが入ってくる場合は、それを使用してください! ArrayListジェネリック型をサポートしており、アダプターにそれを期待させることができます。拡張する必要はありませんArrayAdapter。、、などにBaseAdapter必要な実装を拡張して提供できます。これらはすべて.getCount()getItem(position)getItemId(position)ArrayList

于 2012-09-20T15:40:36.507 に答える
-2

実際、あなたのコードはsmwt間違っています。文字列配列の ArrayList リストを使用

for(int i=0;i<array.length;i++)
{
String record = array.get(i).toString();
String[] itemsInRecord = record.split(",");
list.add(record);      }

ウルアダプターもカスタマイズ。MySimpleArrayAdapter arrayAdapter = new MySimpleArrayAdapter(this, list); listView.setAdapter(arrayAdapter);

private class MySimpleArrayAdapter extends ArrayAdapter<String> {
private final Context context;
private final Arraylist< String[]> list;
public MySimpleArrayAdapter(Context context,Arraylist< String[]> list) 
{         
super(context, R.layout.rotarowlayout,list);
        this.context = context;           this.list= list;
      }

      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.rotarowlayout, parent, false);
       TextView startTime = (TextView)rowView.findViewById(R.id.rowstarttime);
       TextView duration = (TextView)rowView.findViewById(R.id.rowduration);
       TextView status = (TextView)rowView.findViewById(R.id.rowstatus);
       TextView name = (TextView)rowView.findViewById(R.id.rowclientname);
String[] values= list.get(position);
       startTime.setText("Start Time: " + values[0]);
       duration.setText("Duration:" + values[1]);
       status.setText("Status:" + values[2]);
       name.setText("Client:" + values[3] + values[4]);



        return rowView;}}

あなたの活動クラスでは、置き換えます

ArrayList array =  (ArrayList) bundle.get("rotaArray");
    for(int i = 0; i < array.size(); i++){

         Log.e(TAG, "array pos " + i + " = " +  array.get(i));

    }
    String record = array.get(0).toString();
    String[] itemsInRecord = record.split(",");
    String[] recordItem = new String[5];

   for(int x = 0; x < itemsInRecord.length; x++){

       Log.e(TAG, "token = " + itemsInRecord[x]);
       recordItem[x] = itemsInRecord[x];
  }

   MySimpleArrayAdapter arrayAdapter = new MySimpleArrayAdapter(this, recordItem);
   listView.setAdapter(arrayAdapter);

 ArrayList<String[]> list = new ArrayList<String[]>();

 ArrayList array =  (ArrayList) bundle.get("rotaArray");

    for(int i = 0; i < array.size(); i++){

        String record = array.get(i).toString();
 String[] itemsInRecord = record.split(",");
    list.add(itemsInRecord);  

    }

 MySimpleArrayAdapter arrayAdapter = new MySimpleArrayAdapter(this, list);  
    listView.setAdapter(arrayAdapter);
于 2012-09-20T14:48:13.417 に答える