1

ここに画像の説明を入力カスタム リスト アクティビティを作成しています。ListActivity を拡張したクラスと、そのリスト アクティビティ用の ArrayAdapter を持つクラスの 2 つのクラスがあります。このリストビューには、テキストビューとテーブル レイアウトが含まれています。

問題は、getView をたとえば 2 回呼び出していることです。自動的に 3 回呼び出されます。lsitview をスクロールすると、行が自動的に追加されます。

なぜこれが起こっているのか、これを克服するために何をすべきかを教えてください。

カスタム ビューを生成するための xml

displayweek.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/tvTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="" />

    <HorizontalScrollView android:id="@+id/horizontalScrollView1" android:layout_width="match_parent" android:layout_height="wrap_content">
               <TableLayout android:layout_width="wrap_content" android:id="@+id/tableLayout1" android:layout_height="wrap_content">
               </TableLayout>
      </HorizontalScrollView>

</LinearLayout>

getview を呼び出す

if (weekAdapter == null) {
            weekAdapter = new weekAdapter(this, 0);
        }
        lvSchedule.setAdapter(weekAdapter);
        weekAdapter.add("true"+","+"10:10Am"+","+"Monday"+","+"Tuesday"+","+"Wednesday"+","+"Thusday"+","+"Friday"
                +","+"Saturday"+","+"Sunday");
        weekAdapter.add("true"+","+"10:10Am"+","+" "+","+" "+","+" "+","+"Sumit"+","+" "+","+" "+","+"Humam");

weekAdapter クラス

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ArrayAdapter;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class weekAdapter extends ArrayAdapter<String>{

    Context context;

    public weekAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
        this.context=context;
    }

    public weekAdapter(Context context, int textViewResourceId, String[] objects) {
        super(context,textViewResourceId, objects);
        this.context=context;
    }



    @SuppressLint("NewApi")
    @Override
    public View getView(int position,View convertView,ViewGroup parent)
    {

        if(convertView==null)
        {
            convertView=LayoutInflater.from(getContext()).inflate(R.layout.displayweek,null);       
        }

        TableLayout table=(TableLayout)convertView.findViewById(R.id.tableLayout1);
        TextView tvTime=(TextView)convertView.findViewById(R.id.tvTime);

        String str=getItem(position);
        String []schedule=str.split(",");
        Log.d("schedule length",""+schedule.length);


        if(schedule[0].trim().equals("true"))
            tvTime.setText(""+schedule[1]);
        else
            tvTime.setText("");

         TableRow tr = new TableRow(context);
         tr.setId(1);
         tr.setTag("");                         
         tr.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
         TextView tvMon = new TextView(context);
         tvMon.setId(1);
         tvMon.setText(""+schedule[2]);
         tvMon.setPadding(2, 0, 5, 0);
         tvMon.setTextColor(Color.BLACK);
         tvMon.setHeight(50);
         tvMon.setGravity(Gravity.RIGHT);
         tr.addView(tvMon);

         TextView tvTue = new TextView(context);
         tvTue.setId(1);
         tvTue.setText(""+schedule[3]);
         tvTue.setPadding(2, 0, 5, 0);
         tvTue.setTextColor(Color.BLACK);
         tvTue.setHeight(50);
         tvTue.setGravity(Gravity.RIGHT);
         tr.addView(tvTue);

         TextView tvWed = new TextView(context);
         tvWed.setId(1);
         tvWed.setText(""+schedule[4]);
         tvWed.setPadding(2, 0, 5, 0);
         tvWed.setTextColor(Color.BLACK);
         tvWed.setHeight(50);
         tvWed.setGravity(Gravity.RIGHT);
         tr.addView(tvWed);

         TextView tvThus = new TextView(context);
         tvThus.setId(1);
         tvThus.setText(""+schedule[5]);
         tvThus.setPadding(2, 0, 5, 0);
         tvThus.setTextColor(Color.BLACK);
         tvThus.setHeight(50);
         tvThus.setGravity(Gravity.RIGHT);
         tr.addView(tvThus);

         TextView tvFri = new TextView(context);
         tvFri.setId(1);
         tvFri.setText(""+schedule[6]);
         tvFri.setPadding(2, 0, 5, 0);
         tvFri.setTextColor(Color.BLACK);
         tvFri.setHeight(50);
         tvFri.setGravity(Gravity.RIGHT);
         tr.addView(tvFri);

         TextView tvSat = new TextView(context);
         tvSat.setId(1);
         tvSat.setText(""+schedule[7]);
         tvSat.setPadding(2, 0, 5, 0);
         tvSat.setTextColor(Color.BLACK);
         tvSat.setHeight(50);
         tvSat.setGravity(Gravity.RIGHT);
         tr.addView(tvSat);

         TextView tvSun = new TextView(context);
         tvSun.setId(1);
         tvSun.setText(""+schedule[8]);
         tvSun.setPadding(2, 0, 5, 0);
         tvSun.setTextColor(Color.BLACK);
         tvSun.setHeight(50);
         tvSun.setGravity(Gravity.RIGHT);
         tr.addView(tvSun);
         table.addView(tr, new TableLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));             
        return convertView;
    }

}
4

1 に答える 1

2

getCountメソッドをオーバーライドしていないようです。このメソッドは、行数を返す必要があります。

public int getCount () {
    return n; /* where n is the number of row you want */
}

また、作成される行数をどのように知ることができますか? ヘッダー用に一度だけ作成する必要がありますか? その場合、List の headerView でそれを膨らませる必要があります。

アダプターが実行時にビューを膨張させてリストに表示しようとしているため、 getView が呼び出されるのは正しい動作です。

于 2012-11-10T06:14:24.730 に答える