3

グリッド ビューの画像とテキストを表示しようとしています。データベースからテキストを取得し、後で使用するためにArrayListに保存します。同じように、SDカードから画像を取得して表示しています。

私が書いたコードはうまく機能しますが、問題はgetView()パラメータの位置が正常に機能しないことです。position は 0 で始まり、 0 で終わります。したがって、グリッドの最後の項目は最初の項目と同じです。以下は私のコードです

public class ImageAdapter extends BaseAdapter
    {
        private LayoutInflater inflater;
        public ImageAdapter()
        {
            // TODO Auto-generated constructor stub
            inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public int getCount() 
        {
            // TODO Auto-generated method stub
            return listMainProduct.size();
//          return arrGrpName.size();
        }

        @Override
        public Object getItem(int position) 
        {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public long getItemId(int position) 
        {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) 
        {
            // TODO Auto-generated method stub

            ViewHolder holder = null;
            if(convertView == null)
            {
                holder = new ViewHolder();
                convertView = inflater.inflate(R.layout.album_item, null);
                holder.imgView = (ImageView)convertView.findViewById(R.id.thumbImage);
                holder.txtView = (TextView)convertView.findViewById(R.id.tv);
                holder.txtView.setText(arrGrpName.get(position).toString());

                //Log.v("Text ", "Text :- "+arrGrpName.get(position).toString());
            Log.v("Position ", "Position :- "+position);

                BitmapFactory.Options options=new BitmapFactory.Options();
                options.inSampleSize = 2;

                String path = "/mnt/sdcard/JS_Images";
                File imgFile = new File(path+"/"+arrImageName.get(position).toString()+".jpg");
//              Log.v("Path", ""+(path+"/"+arrImageName.get(position).toString())+".jpg");

                Bitmap myBitmap = null;
                if(imgFile.exists())
                {
                    myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath(),options);
//                  myBitmap = BitmapFactory.decodeFile(arrImageName.get(position),options);
                    holder.imgView.setImageBitmap(myBitmap);
                }
                else  
                {
                }
            }
            else
            {
                holder = (ViewHolder) convertView.getTag();
            }

        return convertView;
        }

    }
    class ViewHolder
    {
        ImageView imgView;
        TextView txtView;
    }

これが私の丸太猫です

08-16 12:40:45.614: V/Position(27928): Position :- 0
08-16 12:40:45.667: V/Position(27928): Position :- 1
08-16 12:40:45.687: V/Position(27928): Position :- 2
08-16 12:40:45.691: V/Position(27928): Position :- 3
08-16 12:40:45.710: V/Position(27928): Position :- 4
08-16 12:40:45.717: V/Position(27928): Position :- 5
08-16 12:40:45.723: V/Position(27928): Position :- 6
08-16 12:40:45.743: V/Position(27928): Position :- 7
08-16 12:40:45.746: V/Position(27928): Position :- 8
08-16 12:40:45.751: V/Position(27928): Position :- 0

アルバム.クラス

public class Album extends Activity 
{
    public static DataSource dataSource;
    private ImageAdapter adapter;

    List<getMainProduct> listMainProduct;
    List<getStyleMst> listStyleMst;

    /**
     * Array of Strings (for temp storage of data form Database)
     **/

    ArrayList<String> arrGrpName = new ArrayList<String>();
    ArrayList<String> arrImageName = new ArrayList<String>();
    ArrayList<String> arrGrpNo = new ArrayList<String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.album);

        dataSource = new DataSource(Album.this);
        listMainProduct = dataSource.getMainProductData();

        /**
         * Getting ImageFolder & ImageName from Database 
         **/

        for(int i = 1 ; i <= listMainProduct.size() ; i++)
        {
            String repImg = null;
            String StrIMGS = dataSource.getImageNameForAlbum(i);
            if(StrIMGS!=null)
            {
                repImg = StrIMGS.replaceAll("%20", " ");
            }
//          Log.v("ImageName ", ""+ StrIMGS);
            String StrFolder = dataSource.getImageFolderFromDB(i);

//          Log.v("FolderName ", ""+ StrFolder);
            Log.v("Path ", ""+ StrFolder+"/"+repImg);
            String Path = StrFolder+"/"+repImg;
            arrImageName.add(Path);
//          Log.v("IMG Size ", "Size :- "+arrImageName);
        }

        /**
         * Getting GroupName & GrpNo form Database
         **/

        for(int i = 0 ; i < listMainProduct.size() ; i++)
        {
            String strGrpName = listMainProduct.get(i).getGrpName();
            int intGrpNo = listMainProduct.get(i).getGrpNo();
            arrGrpName.add(strGrpName);
            Log.v("ArrName ", "ArrayText :- "+arrGrpName.toString());
            arrGrpNo.add(String.valueOf(intGrpNo));
            Log.v("ArrNo ", "ArrayTextNo :- "+arrGrpNo.toString());
        }


        GridView gridView = (GridView)findViewById(R.id.AlbumGrid);
        adapter = new ImageAdapter();
        gridView.setAdapter(adapter);

        /** 
         * When Grid Item Selected or Clicked 
         **/

        gridView.setOnItemClickListener(new OnItemClickListener() 
        {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) 
            {
                // TODO Auto-generated method stub
                Toast.makeText(Album.this, ""+arrGrpNo.get(position).toString(), Toast.LENGTH_SHORT).show();
                Intent i = new Intent(Album.this,Gallery.class);
                i.putExtra("GrpNo", arrGrpNo.get(position).toString());
                startActivity(i);
            }
        });
    }

深刻な助けが必要です ここで何が起こるかわかりません よろしくお願いします

4

2 に答える 2

1

if(convertView==null)ブロックではそれらの参照を取得しviewssetTagelse 部分では前のタグを取得します。他のすべてのものを適用する

{
    holder = (ViewHolder) convertView.getTag();
}

次の変更を加えて試してください

ViewHolder holder = null;
if(convertView == null)
{
    holder = new ViewHolder();
    convertView = inflater.inflate(R.layout.album_item, parent,false);
    holder.imgView = (ImageView)convertView.findViewById(R.id.thumbImage);
    holder.txtView = (TextView)convertView.findViewById(R.id.tv);
    convertView.setTag(holder);
 }
 else
 {
     holder = (ViewHolder) convertView.getTag();
 }

 holder.txtView.setText(arrGrpName.get(position).toString());

 //Log.v("Text ", "Text :- "+arrGrpName.get(position).toString());
 Log.v("Position ", "Position :- "+position);

 BitmapFactory.Options options=new BitmapFactory.Options();
 options.inSampleSize = 2;

 String path = "/mnt/sdcard/JS_Images";
 File imgFile = new File(path+"/"+arrImageName.get(position).toString()+".jpg");
 //Log.v("Path", ""+(path+"/"+arrImageName.get(position).toString())+".jpg");

 Bitmap myBitmap = null;
 if(imgFile.exists())
 {
     myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath(),options);
     //myBitmap = BitmapFactory.decodeFile(arrImageName.get(position),options);
     holder.imgView.setImageBitmap(myBitmap);
 }
 else  
 {
 }

 return convertView;
于 2013-08-16T07:18:42.397 に答える
0

位置の問題は正常であり、(私が思うに)グーグルは「リストビューの世界」の講義でそれについて語っています。レイアウト フェーズで追加の再計算が必要な場合に発生します。最後の項目ではありません。

できることは、viewHolder 内のアイテムの位置を保持し (convertView の状況に関係なく常に)、パラメーターと同じかどうかを確認することです。そうであれば、単にビューを返します。そうでない場合は、新しい位置に従って更新されたデータを入力します。

私があなたのコードで見つけた別の問題は、convertView==null の場合にのみデータを入力することです。

これは間違っています。convertView の状況に関係なく、データを入力する必要があります。null の場合にのみ convertView を置き換え、その viewHolder をビューで埋めて、findViewById の不要な呼び出しを回避します。

于 2013-08-16T08:54:17.907 に答える