我试图了解适配器模式及其在现实世界中的使用.在浏览了互联网和www.dofactory.com上的各种文章之后,我创建了这个示例代码.我只是想知道我的理解是否正确.在下面的示例中,我在Adapter类中创建了MSDAO对象.后来我把它改成了OracleDAO.
class Client
{
static void Main(string[] args)
{
ITarget objAdapter = new Adapter();
object dummyObject = objAdapter.GetData();
}
}
Interface ITarget
{
public void GetData();
}
//Decision to use MSDAO
class Adapter : ITarget
{
public void GetData()
{
MSDAO objmsdao = new MSDAO();
objmsdao.GetData();
}
}
//After a month, the decision to use OracaleDAO was taken, so the code change
class Adapter : ITarget
{
public void GetData()
{
OracleDAO objoracledao = new OracleDAO();
objoracledao.GetData();
}
}
Run Code Online (Sandbox Code Playgroud) 我正在构建一个基于RecyclerView的组件,允许用户通过拖放重新排序项目.一旦我在DragListener端,我需要它在适配器中的位置,以便执行正确的移动,但我只能访问视图.所以这是我在适配器视图绑定中所做的事情:
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
Track track = mArray.get(position);
viewHolder.itemView.setTag(R.string.TAG_ITEM_POSITION, position);
}
Run Code Online (Sandbox Code Playgroud)
你觉得这样对吗?因为如果我移动这样的项目:
public void move(int from, int to){
Track track = mArray.remove(from);
mArray.add(to, track);
notifyItemMoved(from, to);
}
Run Code Online (Sandbox Code Playgroud)
然后位置标记不再正确,如果我notifyDataSetChanged(),我失去了花哨的动画.有什么建议吗?
这是我的自定义CursorAdapter:
public class TasksAdapter extends CursorAdapter implements Filterable {
private final Context context;
public TasksAdapter(Context context, Cursor c) {
super(context, c);
this.context = context;
}
/**
* @see android.widget.CursorAdapter#newView(android.content.Context, android.database.Cursor, android.view.ViewGroup)
*/
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(android.R.layout.simple_list_item_checked, parent, false);
ViewHolder holder = new ViewHolder();
holder.textview = (CheckedTextView)v.findViewById(android.R.id.text1);
v.setTag(holder);
return v;
}
/**
* @see android.widget.CursorAdapter#bindView(android.view.View, android.content.Context, android.database.Cursor)
*/
@Override
public void bindView(View view, Context context, Cursor cursor) …Run Code Online (Sandbox Code Playgroud) 我们什么时候需要去适配器模式?如果可能的话,给我一个适合这种模式的真实世界的例子......
我正在编写一个自定义适配器用于ListView.
该Adapter接口包括getItem()根据文档返回Objectas的方法
与数据集中指定位置关联的数据项.
这个对象应该是什么?我只能想象ListView想要打电话toString或打电话equals,因为没有其他你可以做的原始Object.但是我没有方便Object我可以返回,无论如何我都要覆盖,getView所以ListView不需要我的数据集中的String.
我可以回来null或其他完全不相关的东西吗?
我试图区分监听器和适配器.
它们几乎是一样的但是在监听器中你必须实现接口中的所有方法,但是使用适配器你可以选择只实现你需要的方法,这样代码就是清洁器并且更容易阅读?
我也被告知适配器只允许一个实现实例化,你无法实例化监听器,我不完全理解这一点.
有人可以解释哪一个更好用,哪些你可以做一个但你不能与另一个?
是否有特定的设计模式描述了提供非抽象默认实现的场景,该实现使用空的NO-OP实现实现接口上的所有或部分方法.这样做的目的是减轻子类的负担,实现他们自己可能不需要/使用的方法:
public interface MyInterface {
public void doThis();
public void doThat();
public void done();
}
public class MyClass implements MyInterface {
public void doThis() {
// NO-OP
}
public void doThat() {
// NO-OP
}
public void done() {
// Some standard implementation
}
}
public class MuSubClass extends MyClass {
public void doThat() {
// Subclass only cares about doThat()
}
}
Run Code Online (Sandbox Code Playgroud)
我已经看到过这种模式多次使用,包括SAX框架中的Java的DefaultHandler和MouseAdapter.在某些情况下,这些类被命名为Adapters,但我的印象是适配器模式在两个不同的接口之间进行转换.
鉴于在这些实例中只有一个声明的接口被转换为该接口的未定义子集 - 我不清楚这是如何在适配器模式的精神.
此外,我不太明白这是如何遵循NullObject模式的,因为某些方法可能有一个实现,而NullObject传统上是一个单例.
design-patterns adapter null-object-pattern solid-principles interface-segregation-principle
我在Windows 7上遇到问题 - 如果我插入以太网电缆,Windows将默认使用我的WiFi网络适配器.我希望Windows默认为我的以太网连接.为了解决这个问题,我必须在控制面板的"网络和共享中心"中手动断开WiFi适配器,然后它将识别我的以太网连接.
另一个奇怪的事情是,当我查看控制面板\网络和Internet \网络连接时,我的"TAP-Win32适配器OAS"始终断开连接.我的以太网适配器只有在插入时才会被注意到; 然后它才会显示为一个名为"Realtek PCIe GBE Family Controller"的新适配器.
注意:抱歉,我无法显示屏幕截图,因为我距离能够显示图像只有一个声誉点.
我按照文章如何更改Windows中有线/无线网卡的优先级的步骤和Internet协议路由的自动度量标准功能的说明
以下是我当前的指标(网络适配器优先级):
C:\Users\Michael> netstat -rn
===========================================================================
Interface List
10...1c c1 de 98 1b 88 ......Realtek PCIe GBE Family Controller
16...00 ff fa d7 9e 94 ......TAP-Win32 Adapter OAS
13...00 26 82 c8 41 a7 ......Broadcom 43224AG 802.11a/b/g/draft-n Wi-Fi Adapter
12...70 f3 95 79 4f ec ......Bluetooth Device (Personal Area Network)
24...00 50 56 c0 00 08 ......VMware Virtual Ethernet Adapter for VMnet8
1...........................Software …Run Code Online (Sandbox Code Playgroud) 如何决定何时使用对象适配器以及何时使用类适配器?
问题陈述:创建社交网站并提供来自facebook,google plus和orkut的导入功能.我无法决定是使用对象适配器还是类适配器.
我已经看过Adapter Pattern:Class Adapter vs Object Adapter,但无法理解差异的本质.
我有一个edittext字段和一个"搜索"按钮.当我点击搜索时,我必须显示一个列表视图,其中包含与edittext中输入的值相对应的数据.我使用addHeader()在列表中添加了一个标题.当我第一次搜索时,我能够成功地在List中显示数据.但是当我再次搜索时,我收到以下错误.
FATAL EXCEPTION: main
java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called.
at android.widget.ListView.addHeaderView(ListView.java:261)
at android.widget.ListView.addHeaderView(ListView.java:284)
Run Code Online (Sandbox Code Playgroud)
在设置适配器之前,我已将标题分配给我的列表.
以下是我的代码:
myList = (ListView) findViewById(R.id.searchResultsList);
View header = View.inflate(this, R.layout.search_results_header, null);
myList.addHeaderView(header, null, false);
dataAdapter = new MyCustomAdapter(this, R.layout.results_list_item, searchedResults);
myList.setAdapter(dataAdapter);
Run Code Online (Sandbox Code Playgroud)
我在哪里做错了?