如何在android中选定的网格视图项上加载新模板

时间:2016-08-30 23:09:07

标签: java android templates gridview

我是android新手。我想加载一个新模板,其中包含网格视图对象的选定项目上的两个按钮。 这可能。

我在我的项目中添加了一个gridview,并使用基本适配器将模板加载到gridview的每个项目中。但我想要的是当我点击gridview项目时,我想要为所选项目加载一个新模板(布局)。

问题已解决,以下是已编辑的代码

基础适配器

double data[38][27];
std::ifstream file("YC Rate Levels.csv");

for (int row = 0; row < 38; ++row)
{
    std::string line;
    std::getline(file, line);
    if (!file.good())
        break;

    std::stringstream iss(line);

    for (int col = 0; col < 27; ++col)
    {
        std::string val;
        std::getline(iss, val, ',');
        if (!iss.good())
            break;

        std::stringstream convertor(val);
        convertor >> data[row][col];
    }
}

std::cout << "Col 3" << " - " << "Col 4" << std::endl;;
for (int i = 0; i < 38; ++i)
{
    std::cout << data[i][3] << " - " << data[i][4] << std::endl;
}

std::cin.clear(); // reset any error flags
std::cin.ignore(32767, '\n'); // ignore any characters in the input buffer until we find an enter character
std::cin.get(); // get one more char from the user

return 0;

}

KategoriActivity.java

public class KategoriAdapter extends BaseAdapter{

private Context mContext;
private String[] categoryValues;
private Bitmap[] pictures;



//indicate that positon for new template
private int mNewTemplatePos = -1;

public KategoriAdapter(Context context, String[] categoryValues, Bitmap[] pictures) {
    this.mContext = context;
    this.categoryValues = categoryValues;
    this.pictures = pictures;
}

//apply new template to positon
public void useNewTemplate(int pos) {
    mNewTemplatePos =pos;
    //notiy list that data has changed and the list will refresh ui itself.
    notifyDataSetChanged();
}

@Override
public int getCount() {
    return categoryValues.length;
}


@Override
public Object getItem(int possition) {
    return null;
}

@Override
public long getItemId(int possition) {
    return 0;
}

@Override
public View getView(int possition, View convertView, ViewGroup parent) {

    final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    int posId = mNewTemplatePos;

    if (convertView == null){
        if (mNewTemplatePos ==possition){
            convertView = getNewTemplate(inflater,possition);
        }else {
            convertView = getNormalTemplate(inflater,possition);
        }
    }else {
        if (posId==possition){
            convertView = getNewTemplate(inflater,possition);
        }else{
            convertView = getNormalTemplate(inflater,possition);
        }

    }
    return convertView;
}


private View getNormalTemplate(LayoutInflater inflater, int possition) {

    final View grid = inflater.inflate(R.layout.kategoriler_list_item, null);
    TextView cName = (TextView) grid.findViewById(R.id.grid_item_ad);
    ImageView categoryPictures = (ImageView) grid.findViewById(R.id.grid_item_resim);
    cName.setText(categoryValues[possition]);
    categoryPictures.setImageBitmap(pictures[possition]);
    return grid;

}

private View getNewTemplate(LayoutInflater inflater, int possition) {

    final View grid = inflater.inflate(R.layout.kategori_secenek_template, null);
    TextView cName = (TextView) grid.findViewById(R.id.grid_item_ad);
    cName.setText(categoryValues[possition]);
    Button btn_nesne_tani = (Button) grid.findViewById(R.id.btn_nesneleri_taniyalim);
    Button btn_cumle_kur = (Button) grid.findViewById(R.id.btn_cumle_kuralim);


    btn_nesne_tani.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(mContext,"nesne",Toast.LENGTH_SHORT).show();
        }
    });

    btn_cumle_kur.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(mContext,"cümle",Toast.LENGTH_SHORT).show();
        }
    });

    return grid;
}

1 个答案:

答案 0 :(得分:0)

我已经重写了你的KategoriAdapter类:

public class KategoriAdapter extends BaseAdapter {

private Context mContext;
private final String[] categoryValues;
private final Bitmap[] pictures;

//indicate that positon in list are all use new template
private List<Integer> mNewTemplatePos;
public ImageView categoryPictures;

//indicate that this  is normal template view
private final String NORMAL_TEMPLATE = "NORMAL_TEMPLATE";

//indicate that this  is new template view
private final String NEW_TEMPLATE = "NEW_TEMPLATE";

public KategoriAdapter(Context context, String[] categoryValues, Bitmap[] pictures) {
    this.mContext = context;
    this.categoryValues = categoryValues;
    this.pictures = pictures;
    this.mNewTemplatePos = new ArrayList<>();
}

//apply new template to positon
public void useNewTemplate(int pos) {
    mNewTemplatePos.add(pos);
    //notiy list that data has changed and the list will refresh ui itself.
    notifyDataSetChanged();
}

@Override
public int getCount() {
    return categoryValues.length;
}


@Override
public Object getItem(int possition) {
    return null;
}

@Override
public long getItemId(int possition) {
    return 0;
}

@Override
public View getView(int possition, View convertView, ViewGroup parent) {
    final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        if (mNewTemplatePos.contains(possition)) {
            convertView = getNewTemplate(inflater, possition);
            //use tag to indicate the type of the template
            convertView.setTag(NEW_TEMPLATE);
        } else {
            convertView = getNormalTemplate(inflater, possition);
            convertView.setTag(NORMAL_TEMPLATE);
        }
    } else {
        switch ((String) convertView.getTag()) {
            case NORMAL_TEMPLATE:
                //convertView is the normal template view but you need a new template view in possition
                if (mNewTemplatePos.contains(possition))
                    convertView = getNewTemplate(inflater, possition);
                break;
            case NEW_TEMPLATE:
                //convertView is the new template view but you need a normal template view in possition
                if (!mNewTemplatePos.contains(possition))
                    convertView = getNormalTemplate(inflater, possition);
                break;
        }
    }

    return convertView;
}


private View getNormalTemplate(LayoutInflater inflater, int possition) {
    View grid = inflater.inflate(R.layout.kategoriler_list_item, null);
    TextView cName = (TextView) grid.findViewById(R.id.grid_item_ad);
    categoryPictures = (ImageView) grid.findViewById(R.id.grid_item_resim);
    cName.setText(categoryValues[possition]);
    categoryPictures.setImageBitmap(pictures[possition]);
    return grid;
}

private View getNewTemplate(LayoutInflater inflater, int possition) {
    // TODO: 31/08/16 inflate you new template view layout here 
    return youNewTemplateView;
}

}

如果当前contentView在getView()中是正确的模板类型,则应该确定是否有问题,因为当contentView不为null时,contentView可能是列表中的新模板之一。使用tag来指示模板类型很方便。 / p>

何时使用useNewTemplate(位置)?
只需将使用新模板所需的位置应用于useNewTemplate()并在onItemClick()方法中使用它。

grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                useNewTemplate(position);
            }
        });