我有一个问题,我在从 Url 解析的 GridView 中显示图像,我设计了一个优化搜索对话框来优化 GridView 中的搜索,但问题是解析工作正常但 GridView 接下来没有刷新我处理 Refine Search 的时间。表示 GridView 项目不刷新它显示以前的结果。请帮我解决这个问题。
代码:
package org.shopzilla.android.search;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.shopzilla.android.common.R;
import org.shopzilla.android.parsing.SearchResult_Json;
import org.shopzilla.android.parsing.Search_Refine_Json;
import org.shopzilla.android.parsing.Search_refine_grid;
import org.shopzilla.android.product.ProductComparisonActivity;
import com.flurry.android.FlurryAgent;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
public class SearchGridActivity extends Activity{
URL url1;
public static Bitmap[] bmp;
Bundle bundle;
GridView grid;
String prod_id;
public static String str,str1;
public static Boolean flag_grid=false;
public static int count =0;
ImageButton _gridImageButton, brand_options_btn,color_options_btn,mat_options_btn;
Button categories_btn;
public static String keyword;
ArrayList<HashMap<String,Object>> list ;
ListView listView,brandlist, colorlist;
static final int DIALOG_PRODUCE_ID = 0,DIALOG_REFINE_ID=1;
Dialog dialog_category,dialog_refine;
public static ArrayList<String> brand_list_load = new ArrayList<String>();
public static ArrayList<String> store_list_load = new ArrayList<String>();
public static ArrayList<String> brand_count = new ArrayList<String>();
public static ArrayList<String> brand_id = new ArrayList<String>();
public static ArrayList<String> brand_array_list = new ArrayList<String>();
public static ArrayList<String> store_array_list = new ArrayList<String>();
public static ArrayList<String> store_count = new ArrayList<String>();
public static ArrayList<String> store_id = new ArrayList<String>();
public static ArrayList<String> brand_selected = new ArrayList<String>();
public static ArrayList<HashMap<String,Object>> arr_list = new ArrayList<HashMap<String,Object>>();
String final_keyword;
public static Boolean falg=false;
String store_name;
String brand_name;
public String temp;
public static Boolean checkflag=true;
EditText et_search;
ArrayList<String> store_selected = new ArrayList<String>();
ArrayAdapter<String> slected_brand;
ArrayAdapter<String> slected_store;
ListView brand_list,store_list;
ArrayAdapter<String> arrayAdapter,storeAdapter, store_new_adapter, brand_new_adapter;
SimpleAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.searchgrid);
bundle = getIntent().getExtras();
if(count==0)
{
keyword = bundle.getString("keyword");
final_keyword = keyword;
}
//str1 = bundle.getString("temp");
grid = (GridView)findViewById(R.id.Search_Result_Grid);
grid.invalidateViews();
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
final ProgressDialog dialog = ProgressDialog.show(this, "BIZRATE", "Loading.......", true);
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
callHereForEff();
dialog.dismiss();
}
};
Thread checkUpdate = new Thread() {
public void run() {
if(count==1)
{
SearchResult_Json.json_parsing(final_keyword);
}
//SearchResultActivity.set_image();
Search_refine_grid.Json_parsing();
handler.sendEmptyMessage(0);
}
};
checkUpdate.start();
EditText et_search_grid = (EditText)findViewById(R.id.txt_search_grid);
et_search_grid.setText(keyword);
et_search_grid.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent(SearchGridActivity.this,SearchTabActivity.class);
startActivity(intent);
}
});
Button btn_list = (Button)findViewById(R.id.btn_searchresult_list);
Button btn_refine = (Button)findViewById(R.id.btn_RefineSearch);
btn_refine.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
// TODO Auto-generated method stub
arrayAdapter =
new ArrayAdapter<String>(SearchGridActivity.this,R.layout.ref_row, R.id.label, brand_list_load);
storeAdapter =
new ArrayAdapter<String>(SearchGridActivity.this,R.layout.ref_row, R.id.label, store_list_load);
showDialog(0);
}
});
btn_list.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent(SearchGridActivity.this,SearchResultActivity.class);
intent.putExtra("keyword", keyword);
startActivity(intent);
finish();
}
});
/*for(int j=0;j<SearchResultActivity.image_me.size();j++)
{
ImageView iv = new ImageView(this);
//iv.setImageBitmap(SearchResultActivity.me_bmp[j]);
HashMap<String,Object> temp = new HashMap<String,Object>();
temp.put("image",iv.VISIBLE);
temp.put("price", SearchResultActivity.min_price.get(j));
arr_list.add(temp);
}
adapter = new SimpleAdapter(SearchGridActivity.this,arr_list,R.layout.search_result_griditem,new String[] {"image","price"},new int[] {R.id.img_SearchResultGrid_Product,R.id.txt_SearchResultGrid_Price});
grid.setAdapter(adapter);*/
grid.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Toast.makeText(SearchGridActivity.this, "" + position, Toast.LENGTH_SHORT).show();
if(SearchResultActivity.type.get(position).equals("OFFER"))
{
prod_id = SearchResultActivity.id.get(position);
System.out.println("Offer Id==================="+prod_id);
//type_po=true;
Intent intent = new Intent(SearchGridActivity.this,ProductComparisonActivity.class);
intent.putExtra("prod_type", "true");
intent.putExtra("prod_id", SearchResultActivity.id.get(position));
startActivity(intent);
}
else
{
prod_id = SearchResultActivity.id.get(position);
System.out.println("Product Id==================="+prod_id);
//type_po=false;
Intent intent = new Intent(SearchGridActivity.this,ProductComparisonActivity.class);
//intent.putExtra("productType", "SZPID");
intent.putExtra("prod_type", "false");
intent.putExtra("prod_id", SearchResultActivity.id.get(position));
startActivity(intent);
}
}
});
}
//Clear Arraylists
public static void arralist_clear()
{
SearchResultActivity.min_price.clear();
SearchResultActivity.image_me.clear();
}
protected void callHereForEff() {
if(count==1)
{
//ImageAdapter obj1 = new ImageAdapter(this);
//obj1.notifyDataSetChanged();
grid.setAdapter(new ImageAdapter(this));
final ImageAdapter im = new ImageAdapter(this);
im.notifyDataSetChanged();
}
else
{
//ImageAdapter obj = new ImageAdapter(this);
//obj.notifyDataSetChanged();
grid.setAdapter(new ImageAdapter(this));//Load the GridView
final ImageAdapter im = new ImageAdapter(this);
im.notifyDataSetChanged();
}
//grid.setAdapter(adapter);
}
//Showing Images with TextViews in Grid View
public class ImageAdapter extends BaseAdapter{
Context mContext;
public static final int ACTIVITY_CREATE = 10;
public ImageAdapter(Context c){
mContext = c;
}
public int getCount() {
// TODO Auto-generated method stub
return SearchResultActivity.image_me.size();
}
public View getView(int position, View convertView, ViewGroup parent) {
View v;
if(convertView==null){
LayoutInflater li = getLayoutInflater();
v = li.inflate(R.layout.search_result_griditem, null);
TextView tv = (TextView)v.findViewById(R.id.txt_SearchResultGrid_Price);
tv.setText(SearchResultActivity.min_price.get(position));
ImageView iv = (ImageView)v.findViewById(R.id.img_SearchResultGrid_Product);
iv.setImageBitmap(SearchResultActivity.me_bmp[position]);
}
else
{
v = convertView;
}
return v;
}
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
}
//Dialog Creation for Refine Search.
@Override
protected Dialog onCreateDialog(int id) {
brand_list_load.add(brand_array_list.get(0));
store_list_load.add(store_array_list.get(0));
store_new_adapter = new ArrayAdapter<String>(this,R.layout.ref_row, R.id.label, store_array_list);
brand_new_adapter = new ArrayAdapter<String>(this,R.layout.ref_row, R.id.label, brand_array_list);
switch(id) {
case 0:
dialog_refine = new Dialog(this);
dialog_refine.setContentView(R.layout.refine_dialog);
brand_list= (ListView)dialog_refine.findViewById(R.id.exp);
store_list= (ListView)dialog_refine.findViewById(R.id.exp_mat);
brand_list.invalidate();
store_list.invalidate();
brand_options_btn = (ImageButton)dialog_refine.findViewById(R.id.options_btn1);
et_search = (EditText)dialog_refine.findViewById(R.id.txt_RefineSearch);
et_search.setText(keyword);
mat_options_btn = (ImageButton)dialog_refine.findViewById(R.id.options_btn3);
//Loads Brands List
brand_list.setAdapter(arrayAdapter);
//Loads Color List
//Loads Material List
store_list.setAdapter(storeAdapter);
//Reset Button
//Click on any Brand
brand_list.setOnItemClickListener(new OnItemClickListener()
{
public void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3)
{
String brand = (String) (brand_list.getAdapter()).getItem(arg2);
brand_name = "+"+brand;
temp = (String) (brand_list.getAdapter()).getItem(0);
brand_selected.clear();
brand_selected.add(brand);
//brand_list_load.clear();
arrayAdapter.clear();
brand_list.invalidate();
reload_list();
//arrayAdapter.add(brand);
//slected_brand = new ArrayAdapter<String>(this,R.layout.ref_row, R.id.label, brand_selected);
System.out.println("POSITION IS-->"+ brand);
}
});
//Click on any Store
store_list.setOnItemClickListener(new OnItemClickListener()
{
public void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3)
{
String store = (String) (store_list.getAdapter()).getItem(arg2);
store_name = "+"+store;
store_selected.clear();
store_selected.add(store);
//storeAdapter.add(store);
storeAdapter.clear();
store_list.invalidate();
reload_storelist();
System.out.println("POSITION IS-->"+ store);
}
});
//Brand options
brand_options_btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
arrayAdapter.clear();
brand_list.invalidate();
brand_list.setAdapter(brand_new_adapter);
}
});
// Material Options
mat_options_btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
storeAdapter.clear();
store_list.invalidate();
store_list.setAdapter(store_new_adapter);
}
});
Button btn_reset = (Button)dialog_refine.findViewById(R.id.btn_Refine_reset);
btn_reset.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
// TODO Auto-generated method stub
dialog_refine.dismiss();
}
});
//Done Button
Button done_btn=(Button)dialog_refine.findViewById(R.id.btn_Refine_Done);
done_btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
//checkflag=false;
count=1;
SearchResultActivity.arraylists_clear();
final_keyword=et_search.getText().toString()+brand_name+store_name;
Intent intent = new Intent(SearchGridActivity.this, SearchGridActivity.class);
intent.putExtra("keyword", keyword);
startActivity(intent);
}
});
break;
default:
dialog_refine = null;
}
return dialog_refine;
}
protected void reload_storelist() {
// TODO Auto-generated method stub
slected_store= new ArrayAdapter<String>(this,R.layout.ref_row, R.id.label, store_selected);
store_list.setAdapter(slected_store);
}
protected void reload_list() {
//brand_list.invalidate();
//arrayAdapter.clear();
slected_brand = new ArrayAdapter<String>(this,R.layout.ref_row, R.id.label, brand_selected);
brand_list.setAdapter(slected_brand);
//brand_selected.clear();
}
//Flurry Implementation
public void onStart()
{
super.onStart();
FlurryAgent.onStartSession(this, "AJT5DWUVF6IAE78NQV69");
// your code
}
public void onStop()
{
super.onStop();
FlurryAgent.onEndSession(this);
// your code
}
}
最佳答案
我没有检查你所有的代码,但我可以看到一些问题:
1.
grid.setAdapter(new ImageAdapter(this));//Load the GridView
final ImageAdapter im = new ImageAdapter(this);
im.notifyDataSetChanged();
不确定这应该做什么,您创建了一个新的 ImageAdapter,然后在其上调用了 notifyDataSetChanged,这看起来毫无用处,因为它没有绑定(bind)到任何 View 。
2. 你的 ImageAdapter 类坏了,尤其是 getView 方法。 getView 背后的主要思想是你收到一个 convertView 来回收。如果为空,则创建一个 View 并在其中设置信息。如果它不为空,请重新使用 convertView 并在其中设置信息。在您的代码中,您仅在 View 为 null 时设置信息,因此一旦您滚动或更改数据,它将尝试回收 View ,并且您不会更改它们的内容。
方法应该是这样的
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null){
// No view passed, create one !
LayoutInflater li = getLayoutInflater();
v = li.inflate(R.layout.search_result_griditem, parent, false);
}
// Set the view's content
TextView tv = (TextView)v.findViewById(R.id.txt_SearchResultGrid_Price);
tv.setText(SearchResultActivity.min_price.get(position));
ImageView iv = (ImageView)v.findViewById(R.id.img_SearchResultGrid_Product);
iv.setImageBitmap(SearchResultActivity.me_bmp[position]);
return v;
}
您还可以保留对适配器的引用,并在您希望 GridView 刷新其内容时调用 notifyDataSetChanged。
最后,您可能不希望 ImageAdapter 中的 getItemId 方法一直返回 0,因为 GridView 使用该 id 来管理回收 View 和所有 View 。一个更简单的实现是
public long getItemId(int position){
return position;
}
可能还值得填充 getItem 方法。
关于android - 在 Android 中动态刷新 Gridview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6469449/
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO
首先,我使用的是rails3.1.3和来自master的carrierwavegithub仓库的分支。我使用after_init钩子(Hook)来确定基于属性的字段页面模型实例并为这些字段定义属性访问器将值存储在序列化哈希中(希望它清楚我是什么谈论)。这是我正在做的事情的精简版:classPage省略mount_uploader命令让我可以访问我想要的属性。但是当我安装uploader时出现错误消息说“nil类的未定义新方法”我在源代码中读到有方法read_uploader和扩展模块中的write_uploader。我如何必须覆盖这些来制作mount_uploader命令使用我的“虚拟
我正在尝试动态构建一个多维数组。我想要的基本上是这样的(为简单起见写出来):b=0test=[[]]test[b]这给了我错误:NoMethodError:undefinedmethod`test=[[],[],[]]而且它工作正常,但在我的实际使用中,我不会事先知道需要多少个数组。有一个更好的方法吗?谢谢 最佳答案 不需要像您正在使用的索引变量。只需将每个数组附加到您的test数组:irb>test=[]=>[]irb>test[["a","b","c"]]irb>test[["a","b","c"],["d","e","f"]]
如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail
如何在对象上调用方法名称的嵌套哈希?例如,给定以下哈希:hash={:a=>{:b=>{:c=>:d}}}我想创建一个方法,给定上面的散列,执行以下操作:object.send(:a).send(:b).send(:c).send(:d)我的想法是我需要从一个未知的关联中获取一个特定的属性(这个方法不知道,但程序员知道)。我希望能够指定一个方法链来以嵌套哈希的形式检索该属性。例如:hash={:manufacturer=>{:addresses=>{:first=>:postal_code}}}car.execute_method_hash(hash)=>90210
我有一个ruby程序,我想接受用户创建的方法,并使用该名称创建一个新方法。我试过这个:defmethod_missing(meth,*args,&block)name=meth.to_sclass我收到以下错误:`define_method':interningemptystring(ArgumentError)in'method_missing'有什么想法吗?谢谢。编辑:我以不同的方式让它工作,但我仍然很好奇如何以这种方式做到这一点。这是我的代码:defmethod_missing(meth,*args,&block)Adder.class_evaldodefine_method
假设我们有A、B、C类。Adefself.inherited(sub)#metaprogramminggoeshere#takeclassthathasjustinheritedclassA#andforfooclassesinjectprepare_foo()as#firstlineofmethodthenrunrestofthecodeenddefprepare_foo#=>prepare_foo()neededhere#somecodeendendBprepare_foo()neededhere#somecodeendend如您所见,我正在尝试将foo_prepare()调用注入
这里我想输出带有动态组名的json而不是单词组@tickets.eachdo|group,v|json.group{json.array!vdo|ticket|json.partial!'tickets/ticket',ticket:ticketend}end@ticket是这样的散列{a:[....],b:[.....]}我想要这样的输出{a:[.....],b:[....]} 最佳答案 感谢@AntarrByrd,这个问题有类似的答案:JBuilderdynamickeysformodelattributes使用上面的逻辑我已经