我有一个gridview,它使用pojo显示来自web服务的图像和文本。我想在所有其他图像之前添加图像(没有文本)(作为第1项)。即使没有来自Web服务的图像,即服务器数据库没有图像,该图像也应该可用。
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 :(得分:0)
实现这一目标很简单。像这样创建一个虚拟GridItem:
String myPermanentUri = "your_uri_here";
GridItem myPermanentGridItem = new GridItem();
myPermanentGridItem.setImage(myPermanentUri);
//Initialize other properties as well
myPermanentGridItem.setDate("");
myPermanentGridItem.setMonth("");
现在将此添加到您的列表中,无论您是否从服务器获取任何信息。
ArrayList<GridItem> mGridItems = getFromServer(); //Just modify the implementation as per your code
if(mGridItems == null){
mGridItems = new ArrayList<>();
}
mGridItems.add(0, myPermanentGridItem);
现在将其传递给您的适配器。 如果您有任何疑问,请与我们联系。
<强>更新强>:
如果position == 0,您可以将getView方法更改为使用其他布局。 e.g:
@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
更新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");
}