簡體   English   中英

無法將數據從適配器填充到Fragment中的GridView

[英]Can not fill data from Adapter to GridView in Fragment

我在Fragment類中具有Adapter類,如下所示:

更新:

public class FeedBackFragment extends Fragment {

ProgressDialog pDialog;
JSONParser jsonParser = new JSONParser();


MyAdapter adapter;
ArrayList<Item> manufacturersList = new ArrayList<>();
JSONArray manufacturers = null;

// manufacturers JSON url
private static final String URL_MANUFACTURERS = "URL";

public FeedBackFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.feedback_gridview_manufacturer, container, false);

    GridView gridView = (GridView) view.findViewById(R.id.gridview);
    // gridView.setAdapter(new MyAdapter(getActivity(), manufacturersList));

    adapter = new MyAdapter(getActivity(), manufacturersList);
    gridView.setAdapter(adapter);


    gridView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View view, int arg2, long arg3) {
            // on selecting a single manufacturer
            // CategoryCarActivity will be launched to show category car inside the manufacturer
            Intent i = new Intent(getActivity(), CategoryCarActivity.class);

            // send manufacturer id to activity to get list of cars under that manufacturer
            String manufacturer_id = ((TextView) view.findViewById(R.id.manufacturer_id)).getText().toString();
            i.putExtra("manufacturer_id", manufacturer_id);

            startActivity(i);
        }
    });

    return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);

    // manufacturersList = new ArrayList<>();
    new LoadAllManufacturers().execute();
}


class LoadAllManufacturers extends AsyncTask<String, String, String> {
    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(getActivity());
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

        adapter.notifyDataSetChanged();
        // dismiss the dialog after getting all manufacturers
        if (pDialog.isShowing())
            pDialog.dismiss();
    }
}

private class MyAdapter extends BaseAdapter
{
    private LayoutInflater inflater;

    public MyAdapter(Context context, ArrayList<Item> arrayList)
    {
        this.manufacturersList = arrayList;
        inflater = LayoutInflater.from(context);
    }

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

    @Override
    public Object getItem(int i)
    {
        return manufacturersList.get(i);
    }

    @Override
    public long getItemId(int i)
    {
        return manufacturersList.get(i).drawableId;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup)
    {
        View v = view;
        ImageView picture;
        TextView name;

        if(v == null)
        {
            v = inflater.inflate(R.layout.gridview_item, viewGroup, false);
            v.setTag(R.id.picture, v.findViewById(R.id.picture));
            v.setTag(R.id.text, v.findViewById(R.id.text));
        }

        picture = (ImageView)v.getTag(R.id.picture);
        name = (TextView)v.getTag(R.id.text);

        picture.setImageResource(item.drawableId);
        name.setText(item.name);

        return v;
    }
  }
}

Item.java

public class Item
{
    final String name;
    final int drawableId;
Item(String name, int drawableId)
{
    this.name = name;
    this.drawableId = drawableId;
}

}

我的gridview_item.xml:

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

<com.totoroads.android.app.SquareImageView
    android:id="@+id/picture"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="centerCrop"
    />
<TextView
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingTop="15dp"
    android:paddingBottom="15dp"
    android:layout_gravity="bottom"
    android:textColor="@android:color/white"
    android:background="#55000000"
    />

我不能在POJO類中的Adapter類中填充數據嗎? 而且我不知道如何將ArrayList ManufacturerList更改為POJO,我需要每個人的幫助。 我已經搜索並嘗試了很多方法,但是沒有成功

已更新,在以下行引起錯誤:

    picture.setImageResource(item.drawableId);
    name.setText(item.name);

您應該更改適配器的構造函數,並接收Item列表對象而不是HashMap。

ArrayList ManufacturersList;

private LayoutInflater inflater;

public MyAdapter(Context context, ArrayList<Item> arrayList)
{
    this.manufacturersList = arrayList;
    inflater = LayoutInflater.from(context);
}

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

@Override
public Object getItem(int i)
{
    return manufacturersList.get(i);
}

@Override
public long getItemId(int i)
{
    return manufacturersList.get(i).drawableId;
}

並使您的Item類成為全局類,以便Activity也可以訪問它。

並在您的AsyncTast中,而不是將數據添加到HashMap中,而是將其添加到ArrayList中

ArrayList<Item> manufacturersList = new ArrayList<>(); // declare outside your AsyncTask


//Inside AsyncTask loop

Item item = new Item(name,id);  // I hope id is your drawableID
manufacturersList.add(item );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM