2016-02-17 4 views
0

У меня есть сетка, которая отображает изображения и текст из веб-сервиса с помощью pojo. Я хочу добавить изображение (без текста) перед всеми другими изображениями (как 1-й элемент). Это изображение должно быть доступно, даже если нет изображений из веб-службы, т. Е. Если в базе данных сервера нет изображений.Добавить изображение в первую ячейку в gridview

GridView Adapter 
 

 
public class GridViewAdapter extends ArrayAdapter<GridItem> { 
 

 
    private Context mContext; 
 
    private int resource; 
 
    private ArrayList<GridItem> mGridData = new ArrayList<GridItem>(); 
 

 
    public GridViewAdapter(Context mContext, int resource, ArrayList<GridItem> mGridData) { 
 
     super(mContext, resource, mGridData); 
 
     this.resource = resource; 
 
     this.mContext = mContext; 
 
     this.mGridData = mGridData; 
 
    } 
 

 
    public void setGridData(ArrayList<GridItem> mGridData) { 
 
     this.mGridData = mGridData; 
 
     notifyDataSetChanged(); 
 
    } 
 

 
    @Override 
 
    public View getView(int position, View convertView, ViewGroup parent) { 
 
     View v = convertView; 
 
     ViewHolder holder = null; 
 
     if (v == null) { 
 

 
      LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); 
 
      v = inflater.inflate(resource, parent, false); 
 
      holder = new ViewHolder(); 
 

 
      holder.image = (ImageView) v.findViewById(R.id.item_image); 
 
      holder.date = (TextView) v.findViewById(R.id.item_date); 
 
      holder.month = (TextView) v.findViewById(R.id.item_month); 
 

 
      v.setTag(holder); 
 
     } else { 
 
      holder = (ViewHolder) v.getTag(); 
 

 
     } 
 

 
     GridItem item = mGridData.get(position); 
 

 
     Picasso 
 
       .with(mContext) 
 
       .load(item.getImage()) 
 
       .placeholder(R.drawable.placeholder) 
 
       .fit() 
 
       .into(holder.image); 
 

 
     holder.date.setText(item.getDate()); 
 
     holder.month.setText(item.getMonth()); 
 

 
     return v; 
 
    } 
 

 
    class ViewHolder { 
 
     ImageView image; 
 
     TextView date; 
 
     TextView month; 
 
    } 
 

 
}
POJO 
 

 
public class GridItem { 
 

 
    private String textDateUrls, textMonthUrls; 
 
    private String imageUrls; 
 

 
    public GridItem() { 
 
     super(); 
 
    } 
 

 
    public String getImage() { 
 
     return imageUrls; 
 
    } 
 

 
    public void setImage(String imageUrls) { 
 
     this.imageUrls = imageUrls; 
 
    } 
 

 
    public String getDate() { 
 
     return textDateUrls; 
 
    } 
 

 
    public void setDate(String textDateUrls) { 
 
     this.textDateUrls = textDateUrls; 
 
    } 
 

 
    public String getMonth() { 
 
     return textMonthUrls; 
 
    } 
 

 
    public void setMonth(String textMonthUrls) { 
 
     this.textMonthUrls = textMonthUrls; 
 
    } 
 

 
}
Main Activity 
 

 
public class MainActivity extends AppCompatActivity { 
 

 
    private GridView mGridView; 
 
    private GridItem newItem; 
 
    private GridViewAdapter mGridAdapter; 
 
    private ArrayList<GridItem> mGridData; 
 
    public static final String KEY_USERID = "user_id"; 
 
    private static final String REGISTER_URL = "http://staging.techunits.com/android_login_api/Services.php?action=fetchUserLog"; 
 

 

 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState){ 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_main); 
 

 
     mGridView = (GridView)findViewById(R.id.gridView); 
 
     registerUser(); 
 

 
     mGridData = new ArrayList<>(); 
 
     mGridAdapter = new GridViewAdapter(this, R.layout.profile_gridview_item, mGridData); 
 
     mGridView.setAdapter(mGridAdapter); 
 
     newItem = new GridItem(); 
 
     String imageUri = "drawable://" + R.mipmap.ic_add; 
 
     //mGridData.add(0, newItem); 
 

 

 
    } 
 

 

 
    private void registerUser(){ 
 

 
     StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL, 
 
       new Response.Listener<String>() { 
 
        @Override 
 
        public void onResponse(String response) { 
 

 
         try { 
 
          JSONObject jObj = new JSONObject(response); 
 
          String status = jObj.getString("status"); 
 

 
          // Now check status value 
 
          if (status.equals("0")) { 
 

 
           Toast.makeText(getApplicationContext(), "There was some error! Please try again.", Toast.LENGTH_LONG).show(); 
 

 
          }else if(status.equals("1")){ 
 

 
           mGridAdapter.setGridData(mGridData); 
 

 
           JSONArray result = jObj.getJSONArray("results"); 
 
           GridItem item; 
 
           for(int i = 0 ; i <result.length() ; i++){ 
 
            JSONObject json_data = result.getJSONObject(i); 
 

 
            String image = json_data.getString("images"); 
 
            String date = json_data.getString("date"); 
 

 
            item = new GridItem(); 
 
            item.setImage(image); 
 
            item.setDate(date); 
 
            mGridData.add(item); 
 
           } 
 

 

 

 

 

 
          } else { 
 
           // Error in login. Get the error message 
 
           String errorMsg = jObj.getString("error_msg"); 
 
           Toast.makeText(getApplicationContext(), errorMsg, Toast.LENGTH_LONG).show(); 
 
          } 
 
         } catch (JSONException e) { 
 
          // JSON error 
 
          e.printStackTrace(); 
 
          Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show(); 
 
         } 
 

 

 

 
        } 
 
       }, 
 
       new Response.ErrorListener() { 
 
        @Override 
 
        public void onErrorResponse(VolleyError error) { 
 
         Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_LONG).show(); 
 
        } 
 
       }){ 
 
      @Override 
 
      protected Map<String,String> getParams(){ 
 
       Map<String,String> params = new HashMap<String, String>(); 
 
       params.put(KEY_USERID, "21"); 
 
       return params; 
 
      } 
 

 
     }; 
 

 
     RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext()); 
 
     requestQueue.add(stringRequest); 
 
    } 
 

 

 

 

 
}

+0

Если вы пишете код с нуля, я бы настоятельно предложил использовать «RecyclerView» вместо o f listview. Это было бы легко достичь в «RecyclerView». – Shubham

+0

Как добавить изображение в 0 позицию в Recyclerview? @Shubham – Sam

+0

Просьба ознакомиться с документацией «RecyclerView». Для этого вам нужно будет использовать два пользовательских представления. Предупреждение: Recycler не предоставляет прослушиватели заголовка, нижнего колонтитула и элемента. Вам нужно реализовать все это самостоятельно. Но как только вы понимаете и реализуете это в первый раз, все довольно просто. – Shubham

ответ

0

Существует простой хак для достижения этой цели. Создание фиктивной GridItem вроде этого:

String myPermanentUri = "your_uri_here"; 
GridItem myPermanentGridItem = new GridItem(); 
myPermanentGridItem.setImage(myPermanentUri); 
//Initialize other properties as well 
myPermanentGridItem.setDate(""); 
myPermanentGridItem.setMonth(""); 

Теперь добавьте это в свой список, независимо от того, является ли вы получаете anythign с вашего сервера или нет.

ArrayList<GridItem> mGridItems = getFromServer(); //Just modify the implementation as per your code 
if(mGridItems == null){ 
    mGridItems = new ArrayList<>(); 
} 
mGridItems.add(0, myPermanentGridItem); 

Теперь передайте это вашему адаптеру. Дайте мне знать, если у вас есть какие-либо вопросы.

UPDATE:

Вы можете изменить метод GetView использовать другую раскладку, если позиция == 0. например:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    ViewHolder holder = null; 
    if (v == null) { 

     LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); 

     if(position == 0){ 
      resource = R.layout.my_permanent_item_layout; 
     } 

     v = inflater.inflate(resource, parent, false); 
     holder = new ViewHolder(); 

     //Modify this code accordingly 
     holder.image = (ImageView) v.findViewById(R.id.item_image); 
     holder.date = (TextView) v.findViewById(R.id.item_date); 
     holder.month = (TextView) v.findViewById(R.id.item_month); 

     v.setTag(holder); 
    } else { 
     holder = (ViewHolder) v.getTag(); 
    } 

    //Rest of the code 

UPDATE 2:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    ViewHolder holder = null; 
    if (v == null) { 

     LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); 

     v = inflater.inflate(resource, parent, false); 
     holder = new ViewHolder(); 

     holder.image = (ImageView) v.findViewById(R.id.item_image); 
     holder.date = (TextView) v.findViewById(R.id.item_date); 
     holder.month = (TextView) v.findViewById(R.id.item_month); 

     v.setTag(holder); 
    } else { 
     holder = (ViewHolder) v.getTag(); 
    } 

    //Rest of the code 
    if(position == 0){ 
     holder.date.setVisibility(View.GONE); 
     holder.month.setVisibility(View.GONE); 
    }else{ 
     holder.date.setVisibility(View.VISIBLE); 
     holder.month.setVisibility(View.VISIBLE); 
     //Set the values: 
     holder.date.setText("your_value"); 
     holder.month.setText("your_value"); 
    } 
+0

Спасибо за ответ. Есть одна проблема. «Не удается разрешить insertAt()» @Wanted – Sam

+0

Неплохо, используйте mGridItems.add (0, myPermanentGridItem); Изменит ответ так же – Wanted

+0

Да. Я понял. – Sam